.NETStandard 1.0中的方法System.Type.GetGenericArguments()
'缺失',我认为TypeInfo.GenericTypeArguments
是GetGenericArguments()
的替代品,但不幸的是,当提供开放式通用时,它们的行为会有所不同类型。以下面的代码为例:
Type type = typeof(ICommandHandler<>);
type.GetGenericArguments(); // return { TCommand }
type.GetTypeInfo().GenericTypeArguments; // returns empty array
虽然GetGenericArguments()
方法返回泛型类型参数TCommand
,但GenericTypeArguments
只返回一个相同的open-generic类型的空数组。
GenericTypeArguments
的确切行为是什么,以及.NET Standard 1.0中Type.GetGenericArguments()
的等价物是什么?
答案 0 :(得分:12)
经过进一步调查,如果类型不是泛型类型定义,Type.GenericTypeArguments
似乎只返回任何内容。另一方面,TypeInfo.GenericTypeParameters
仅在类型是泛型类型定义时返回any。
以下代码模仿Type.GetGenericArguments()
的行为:
type.GetTypeInfo().IsGenericTypeDefinition
? type.GetTypeInfo().GenericTypeParameters
: type.GetTypeInfo().GenericTypeArguments;
答案 1 :(得分:4)
毕竟,这可能会成为评论(而不是答案)。
在.NET 4.6.1上,System.Type
上有两个成员,即:
/* 1 */ type.GetGenericArguments() // returns { TCommand, }
/* 2 */ type.GenericTypeArguments // returns empty array
加上System.Reflection.TypeInfo
上的一名成员,即:
/* 3 */ type.GetTypeInfo().GenericTypeParameters // returns { TCommand, }
总共三个成员。
但是,System.Reflection.TypeInfo
的子类System.Type
也是继承的继承。
在.NET 4.6.1上,当您执行type.GetTypeInfo().GenericTypeArguments
时(如您的问题),您真的在Type
上调用该属性,即我的成员标记为/* 2 */
。