如果扩展方法存在于导入的程序集中,有什么必要?我在类库项目中构建了一个,但在我的web项目中无法识别它引用了库。库中的所有其他类和方法都是值得尊重和可见的,但这种扩展方法不是。在库中使用时,扩展方法是可见的。
答案 0 :(得分:59)
引用包含带扩展方法的类的程序集是不够的。您需要在每个要使用扩展方法的源文件中导入包含该类的命名空间。
例如,要使用LINQ到对象,您需要引用 System.Core程序集并导入 System.Linq命名空间(其中包含Enumerable类)使用LINQ扩展方法):
using System.Linq;
答案 1 :(得分:17)
您确定扩展方法已公开吗?
答案 2 :(得分:14)
如果在不使用Extension语法时可以调用Extension方法,请使用Format:
this.MyExtensionMethod()
这解决了我在VS2010中没有找到类的扩展方法的问题。
答案 3 :(得分:2)
对于那些在VB.NET中遇到同样问题的人来说,请注意不仅是扩展方法,而且模块本身需要标记为Public
,否则你会收到这个错误。至少在VS2015社区就是这种情况,其他版本的情况也是如此。
答案 4 :(得分:0)
对于帮助我的示例实现:
(请注意已提及的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")));
}
答案 5 :(得分:0)
对于任何想知道的人,我都遇到了同样的问题。事实证明这是因为程序集的using
语句是别名:
using ex = MyApp.Example
删除别名有效,但我决定添加一个重复的,无别名的using
,这也修复了问题:
using MyApp.Example
using ex = MyApp.Example
答案 6 :(得分:0)
我在相互引用的解决方案中使用枚举上的扩展方法遇到了这个问题,如下所示。 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文件重命名似乎可以解决问题。即时窗口仍然继续给我同样的错误,但至少运行时代码再次起作用。我正在其他几个项目中使用这个确切的模式而没有我在这里遇到的那种问题。
答案 7 :(得分:0)
在我的例子中,Extension方法位于引用不同版本组件的外部引用中。我在两个项目上同步了版本并且工作正常。
答案 8 :(得分:0)
确保使用模板,模板声明与方法签名中声明的内容匹配,&#34;此&#34; ..
所以,
SomeClass<string, string> test = new SomeClass<string, string>();
extensionMethod<key, val>(this SomeClass<key, Lazy<val>>, string val)
{
}
由于延迟包装,扩展方法不会显示。
答案 9 :(得分:0)
您应该注意方法签名
公共静态ILoggingBuilder AddCustomizedLogging(此ILoggingBuilder构建器,字符串appInsightsKey)
“ this”修饰符是扩展方法所必需的
答案 10 :(得分:0)
注意动态类型。
答案很多,但没有一个解决了我的问题,以防万一有人面对这个问题,我的情况是第三方库返回一个“ dynamic
”类型,而我的扩展方法正在处理字符串,所以应用扩展方法时,没有显示编译错误,但是在运行时却显示了。
var a = thirdpartyLibrary.GetValue().MyExtensionMethod();
强制转换为我的扩展方法相同类型的问题。
答案 11 :(得分:0)
在我的案例中,它表示无法识别该方法的原因与扩展方法无关,而是同一个文件中的错误未在IDE中显示-对于我来说,解决方案是重新启动IDE,突然显示了我必须修复的实际错误。