.NETStandard 1.0 / .NET Core中Type.GetGenericArguments()的等价物是什么?

时间:2016-08-24 17:25:38

标签: c# .net .net-core .net-standard

.NETStandard 1.0中的方法System.Type.GetGenericArguments()'缺失',我认为TypeInfo.GenericTypeArgumentsGetGenericArguments()的替代品,但不幸的是,当提供开放式通用时,它们的行为会有所不同类型。以下面的代码为例:

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()的等价物是什么?

2 个答案:

答案 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 */