代码之家  ›  专栏  ›  技术社区  ›  ChiliYago

无法识别扩展方法

  •  42
  • ChiliYago  · 技术社区  · 14 年前

    当一个扩展方法存在于导入的程序集中时,它有什么必要被认可?我在类库项目中构建了一个类库,但在引用该库的Web项目中不识别它。库中的所有其他类和方法都是可识别的,但是这个扩展方法不是。扩展方法在库中使用时可见。

    9 回复  |  直到 7 年前
        1
  •  56
  •   dtb    14 年前

    使用扩展方法引用包含类的程序集是不够的。需要在每个要使用扩展方法的源文件中导入包含类的命名空间。

    例如,要使用Linq to对象,需要引用 系统核心组件 并导入 System.Linq命名空间 (其中包含具有Linq扩展方法的可枚举类):

    using System.Linq;
    
        2
  •  17
  •   Arjan Einbu    14 年前

    您确定扩展方法已公开吗?

        3
  •  12
  •   shA.t Rami Jamleh    7 年前

    如果不使用扩展语法时扩展方法是可调用的,请使用以下格式:

    this.MyExtensionMethod()
    

    这解决了我在VS2010中找不到类的扩展方法的问题。

        4
  •  2
  •   dotNET    8 年前

    对于在vb.net中遇到相同问题的任何人,请注意不仅是扩展方法,而且 模块本身需要标记为 Public 否则你会得到这个错误。至少在VS2015社区中是这样,在其他版本中也可能是这样。

        5
  •  1
  •   tinonetic    9 年前

    对于帮助我的示例实现:

    (注意 this 已经提到的关键字)。

        /// <summary>
        /// Convert current bytes to string
        /// </summary>
        /// <param name="bytes">Current byte[]</param>
        /// <returns>String version of current bytes</returns>
        public static string StringValue(this byte[] currentBytes)
        {
            return string.Concat(Array.ConvertAll(bytes, b => b.ToString("X2")));
        }
    
        6
  •  0
  •   CAVX    8 年前

    对于任何想知道的人来说,我也有同样的问题,所有的答案都不起作用。原来是因为 using 程序集语句的别名为:

    using ex = MyApp.Example
    

    删除别名有效,但我决定添加一个重复的非别名 使用 也解决了问题:

    using MyApp.Example
    using ex = MyApp.Example
    
        7
  •  0
  •   B H    8 年前

    我在解决方案中对枚举使用扩展方法时遇到了这个问题,如下所示。IntelliSense在ApplicationUI项目中为扩展方法工作,它甚至运行时没有编译或运行时错误。但这种方法根本不起作用。此外,即时窗口向我保证BusinessObjectlib.MyEnum不包含具有扩展方法名称的方法,并且找不到任何扩展方法。

    GenericLib - project where extension method on generic enums is defined
    BusinessObjectLib - project where enums were defined, references GenericLib
    ApplicationUI - project referencing both GenericLib and BusinessObjectLib
    

    尽管,从applicationui查看所有项目时,解决方案资源管理器看起来都正常,但当我打开BusinessObjectlib项目时,我可以看到它对genericlib的引用由于某种原因中断了。(和我们所有的代码一样,vs也可能有bug?)首先,我在直接在vs中打开的businessobjectlib项目中工作,删除引用,然后删除该项目,然后以相反的顺序恢复这两个项目。然后我重命名了applicationui.sou文件并强制重新构建它。我可以通过这些操作来解决这个问题,但只有.sou文件重命名似乎可以解决这个问题。即时窗口 仍然 继续给我同样的错误,但至少运行时代码再次工作。我正在其他几个项目中使用这种精确的模式,而没有遇到我在这里遇到的问题。

        8
  •  0
  •   Marco Alves    7 年前

    在我的例子中,扩展方法在引用组件的不同版本的外部引用中。我在这两个项目上同步了版本,它工作了。

        9
  •  -1
  •   eaglei22    7 年前

    确保如果使用模板,模板声明与方法签名中声明的内容匹配,“this”…

    所以,

    SomeClass<string, string> test = new SomeClass<string, string>();
    
    extensionMethod<key, val>(this SomeClass<key, Lazy<val>>, string val)
    {
    }
    

    由于使用了惰性包装器,扩展方法将不会显示。