未识别的扩展方法
在导入的程序集中存在扩展方法时需要遵守什么条件?我在类库项目中构建了一个项目,但在我的Web项目中没有识别出引用该库的项目。库中的所有其他类和方法都是可信的,但是这种扩展方法不是。扩展方法在库中使用时可见。未识别的扩展方法
引用包含具有扩展方法的类的程序集是不够的。您需要在每个要使用扩展方法的源文件中导入包含该类的名称空间。
例如,使用LINQ到对象,则需要引用System.Core程序集并导入System.Linq的命名空间(其中包含与LINQ扩展方法的枚举类):
using System.Linq;
您确定扩展方法是公开的吗?
是这个类被标记为public static,因为它是扩展方法。 – ChiliYago 2010-04-07 16:58:10
Ohhhh YESSSSS!这是我的问题!非常感谢 ! – 2014-06-17 15:05:34
如果扩展方法不使用扩展语法时可调用,可以使用以下格式:
this.MyExtensionMethod()
这清除了我没有找到在VS2010类的扩展方法的问题。
那么使它成为扩展方法有什么意义? – 2014-12-02 10:43:38
@IanKemp它仍然是清晰的语法比'MyExtensionMethodsClass.MyExtensionMethod(本)',并允许您通过更换你的'using'换出的实现。这是一种解耦/依赖注入。 – binki 2016-02-02 20:38:50
@binki这似乎是我可以想象的做DI最不直观和有用的方式。 – 2016-02-05 10:10:08
示例实现,帮助我:
(请注意,已经提到了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")));
}
对于任何人想知道的问题,我有同样的问题没有答案工作。原来,这是因为组件的using
声明别名:
using ex = MyApp.Example
删除别名工作,但我决定,而不是添加重复的,非别名using
,这也解决了这一问题:
using MyApp.Example
using ex = MyApp.Example
我有这个问题,在解决方案的引用中使用扩展方法,如下所示。 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也可能有错误?)。首先,我在VS中直接打开的BusinessObjectLib项目中工作,删除ref,然后删除项目,然后以相反的顺序恢复。然后我重命名了ApplicationUI.sou文件并强制它重建。我能够通过这些操作来解决这个问题,但只有.sou文件重命名似乎有诀窍。即时窗口仍然继续给我同样的错误,但至少运行时代码再次工作。我在其他几个项目中使用这种确切的模式,而没有我在这里遇到的那种问题。
任何人谁,同时具有在VB.NET同样的问题在这里登陆,请注意,不仅扩展方法,但模块本身需要被标记为Public
,否则你会得到这个错误。至少在VS2015社区中情况就是这样,在其他版本中也可能会出现这种情况。
在我的情况,扩展方法是在其中引用的不同版本的组件的外部参考。我在两个项目上同步了版本并且工作。
确保如果使用模板,模板匹配的声明是什么与方法签名中声明,“本” ..
所以,
SomeClass<string, string> test = new SomeClass<string, string>();
extensionMethod<key, val>(this SomeClass<key, Lazy<val>>, string val)
{
}
扩展方法将不会出现,因为懒惰的包装。
不知道-1是为了什么,但是这是我的问题,我在扩展名改成类型和忘了做它的声明和编译器显示没有问题,没有注意到它的时候了。 也许是因为我说的模板意外,而不是仿制药。但重点是。 – eaglei22 2017-06-06 20:07:33
类似:http://stackoverflow.com/questions/1138848/net-list-distinct – 2010-04-07 16:48:15