我注意到有两个方法(一个类方法和一个扩展方法)具有相同的签名,但在类SystemInfo的System.Reflection包中返回类型不同:
分类方法:
public abstract object[] GetCustomAttributes(Type attributeType, bool inherit)
Run Code Online (Sandbox Code Playgroud)
扩展方法(在CustomAttributeExtensions中):
public static IEnumerable<Attribute> GetCustomAttributes(this MemberInfo element, Type attributeType, bool inherit)
Run Code Online (Sandbox Code Playgroud)
我知道用这样的参数调用该方法将始终调用类方法,所以我只是想知道:
如何调用扩展方法?
最重要的是,定义具有与类方法相同签名的扩展的目的是什么?
在框架中进行这种重复并不是一个特征.但这是一个摇滚和困难的地方,他们不得不在.NET 4.5中添加扩展方法.最容易从版本信息块中的MSDN文章的底部看到.扩展方法可用于UWP和Phone项目,遗留方法则不可用.
基本原因是CLR内置的语言预测为4.5.它使WinRT和CLR类型之间的相当大的区别非常不可见.如果程序员有任何暗示它实际上是在UWP的引擎盖下的话,那么WinRT仍然会出生,比现在还要多.很好地隐藏了,但Type类与CLR结婚太多了,他们不得不提供TypeInfo类作为替代.和扩展方法来弥合api差距.
如果您没有针对UWP,那么您对扩展方法没有多大用处,应该支持遗留方法.扩展方法慢了约30%.