.NET的System.Type.GenericTypeArguments和System.Type.GetGenericArguments()之间的区别

5
为什么.NET框架同时提供了两种不同的方式呢?
System.Type.GenericTypeArguments

并且

System.Type.GetGenericArguments()

这两个都返回给定泛型类型的类型参数(都作为Type[])?

看起来这个属性和方法暴露了完全相同的功能,这意味着API接口具有冗余/重复的功能?

2个回答

5

当该类型是泛型类型的实现时,GenericTypeArguments 属性实际上是通过调用 GetGenericArguments 方法来实现的:

public virtual Type[] GenericTypeArguments {
  get {
    if (IsGenericType && !IsGenericTypeDefinition){
      return GetGenericArguments();
    } else {
      return Type.EmptyTypes;
    }
  }
}

来源: http://referencesource.microsoft.com/#mscorlib/system/type.cs,0aa31a7de47b9dc7

这是一个指向微软官方网站的链接,其中包含有关于系统类型的C#源代码。

真的吗?那很奇怪...如果GenericTypeArguments的目的像你说的那样,那么它不应该是一个布尔值吗?! 返回一个空数组有什么用 - 为了说明一个类型是否是泛型类型定义?! - Veverke
1
@Veverke:如果类型是泛型类型的实现,则它返回一个类型数组。typeof(List<>).GenericTypeArguments 返回一个空数组,typeof(List<int>).GenericTypeArguments 返回一个包含 typeof(int) 的数组,而 typeof(List<>).GetGenericArguments() 返回一个包含泛型参数 T 的类型数组。 - Guffa
哦...这更清晰了,尽管要跟上这些名字并不容易... - Veverke
我忘记了.NET在去年11月份已经成为开源的了...我本来想搜索代码,但是认为这件事还没有发生。谢谢! - Veverke

3
当您查看这些成员在MSDN文章中的版本信息文档时,这一点将变得更加明显。GenericTypeArguments属性支持WinRT(也称为Windows Store应用程序),但GetGenericArguments()方法则不支持。
WinRT在.NET Framework 4.5版本中引起了许多变化,但大多数变化并不那么明显。框架内置的语言投影遮盖了大部分基础类型系统的差异,并隐藏了WinRT实质上是基于COM的事实。但如果使用反射,就必须采取非常不同的方法来处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接