我注意到在System.Reflection包MemberInfo中有两个方法(一个类方法和一个扩展方法)具有相同的签名,但返回类型不同:
类方法:
public abstract object[] GetCustomAttributes(Type attributeType, bool inherit)扩展方法(内部CustomAttributeExtensions )
public static IEnumerable<Attribute> GetCustomAttributes(this MemberInfo element, Type attributeType, bool inherit)我知道用这样的参数调用该方法总是会调用类方法,所以我只是想知道:
如何调用扩展方法?
最重要的是,定义具有与类方法相同签名的扩展的目的是什么?
发布于 2017-07-07 09:21:09
在框架中存在这种复制并不完全是一项功能。但是这是一个困难的地方,他们不得不在.NET 4.5中添加扩展方法。最容易从版本信息块中的MSDN文章底部看到。扩展方法在UWP和Phone项目中是可用的,而遗留方法则不适用。
其根本原因是在4.5的CLR中内置了语言预测。这使得WinRT和CLR类型之间存在着相当大的差异,这是不可见的。如果程序员有任何迹象表明,实际上是COM在驱动UWP :)很好地隐藏了,但是Type类与CLR的结合太重了,他们不得不提供TypeInfo类作为替代。和扩展方法来弥补api之间的差距。
如果不以UWP为目标,那么扩展方法就没有多大用处,应该更倾向于遗留方法。扩展方法大约慢了30%。
发布于 2017-07-07 08:00:12
您是对的,MemberInfo.GetCustomAttributes和CustomAttributeExtensions.GetCustomAttributes实际上具有相同的参数集。
如果您查看每个引用源,您可以看到扩展方法实际上将委托给Attribute.GetCustomAttribute。这种方法最终会回到MemberInfo.GetCustomAttributes。
那这两者之间有功能上的区别吗?不,不是真的。那么这种扩展方法存在的原因是什么呢?不幸的是我不知道。CustomAttributeExtensions的主要优点是泛型重载,它允许您返回类型化属性,因此我不认为您实际上希望在通常情况下使用GetCustomAttributes。
https://stackoverflow.com/questions/44965286
复制相似问题