为什么.NET方法有时会返回一般类型而不是使用泛型和类型约束?

时间:2014-12-22 14:27:58

标签: c# generics

例如,考虑一下方法:

public static Attribute GetCustomAttribute(this ParameterInfo element, Type attributeType);

System.Reflection.CustomAttributeExtensions

中定义

改为定义更有意义:

public static T GetCustomAttribute<T>(this ParameterInfo element, T attributeType) where T : Attribute;

保存演员?

3 个答案:

答案 0 :(得分:3)

检索自定义属性的非泛型方法来自未实现泛型的旧.NET时代。

对于当前和未来的编码,如果您使用的是.NET 4.5及以上版本进行编码,则可以利用CustomAttributeExtensions.GetCustomAttributes<T> -

可悲的是 - 或者实际上 - 软件有一个连续的演变。我的意思是,曾经有一段时间我们没有通用(.NET 1.0和1.1),而且很多代码库都是从早期的.NET版本继承而来的,并且由于框架的原因团队优先级似乎并非所有使用通用参数的方法都已实现。

关于继承的代码

@BenRobinson在下面的一些评论中说:

  

我的观点是添加了这些扩展方法   .net 4.5(所有这些不仅仅是通用的)和扩展方法   在泛型之后添加了任何类型的非通用扩展方法   与.net 1.0 / 1.1的向后兼容性无关。

我添加此内容是为了避免混淆:因为向后兼容第三方代码,因此无法理解继承的代码,因为Microsoft没有更改非通用代码库

实际上,我指出当前的.NET版本本身有很多代码从早期的.NET版本继承而来,要么微软的意图是保持与第三版的向后兼容性 - 党代码与否。

我假设或猜测.NET Framework团队已经优先考虑新的基类库(BCL)和卫星框架的添加,并且来自仿制前时代的一些成员仍然,因为改变不是&值得付出努力,或者我们可以讨论它是否值得付出努力并且他们确实设计了决策错误,但StackOverflow不是讨论板,是吗?

答案 1 :(得分:0)

在版本2中,Generics被添加到C#语言中。我相信属性是在版本1或1.1的语言中(不记得哪个,我认为它在版本1中但我可能是错的)。

这意味着即使他们通过改变所有使用泛型的方法来节省大量不必要的强制转换,但它们可能会破坏向后的兼容性。打破向后兼容性是不好的。

修改

另外,我只想到了另一个原因。 如果您正在编写反射代码,通过反射调用泛型方法通常会非常麻烦(C#有一个非常愚蠢的api这样做...)所以如果您正在编写反射代码然后使用非泛型版本在许多情况下比使用通用的方法容易得多。

再次修改:

该死的,Ben Robinson一分钟就把我击败了反射点! :)

答案 2 :(得分:0)

确实存在一个与您的示例GetCustomAttribute<T>(ParameterInfo)等效的重载,但是为了在没有讨厌的反射的情况下调用此方法,您需要在编译时知道T的类型。如果您仅在运行时知道T的类型,则等效方法为GetCustomAttribute(ParameterInfo, Type)