在.NETStandard 1.0 / .NET Core中,Type.GetGenericArguments()的等效方法是什么?

15

在.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只返回一个空数组。

GenericTypeArguments的确切行为是什么,以及在.NET Standard 1.0中Type.GetGenericArguments()的等效方法是什么?


3
@DavidL:.NETStandard是.NET标准库的一个正式规范,旨在在所有.NET运行时上都可用。.NET 1.0非常老,而.NETStandard是新的,更精确地说,是新的PCL。 - Steven
你有.GetTypeInfo().GenericTypeParameters吗? - Jeppe Stig Nielsen
@HansPassant,我的问题是:我应该调用哪个方法或属性才能获得相同的行为,因为新属性显然不是我需要的。 - Steven
没有好的替代方案来弥补缺失的功能。顺便说一下,.NET Core中的反射功能需要进行大规模改进,我通常建议任何人等待谚语版本3,因为微软总是能做到最好。 - Hans Passant
只是一条提醒,.Net Core 1.0实际上是netstandard 1.6,而不是1.0。Netstandard 1.0适用于 .net 4.5之前的版本,仅与Windows phone 8兼容。.net 4.6.2对应的是netstandard 1.5。 - Scott Chamberlain
显示剩余4条评论
2个回答

13

经过进一步调查,Type.GenericTypeArguments 似乎只在类型不是泛型类型定义时返回任何内容。而另一方面,TypeInfo.GenericTypeParameters 只有在类型是泛型类型定义时才返回任何内容。

下面的代码模仿了 Type.GetGenericArguments() 的行为:

type.GetTypeInfo().IsGenericTypeDefinition 
    ? type.GetTypeInfo().GenericTypeParameters 
    : type.GetTypeInfo().GenericTypeArguments;

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


这是一个有趣的观察。不幸的是,它并没有回答我的问题。你有什么想法如何在.NET Standard 1.0下获取开放式泛型类型参数吗? - Steven
抱歉,Steven,不是的。如果我正确理解了Scott Chamberlain对你问题的评论,也许这可能会启发某人找到.NET Standard 1.5(_edit:_甚至.NET Standard 1.1)或更高版本的解决方案。 GetGenericArguments()GenericTypeArgumentsGenericTypeParameters三个名称如此混乱,真令人困惑。在某些意义上,Microsoft .NET Framework已经变得杂乱无章。 ".NET Standard"的目的是否也包括整理这样的事情呢? - Jeppe Stig Nielsen

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