简体   繁体   中英

What is the equivalent of Type.GetGenericArguments() in .NETStandard 1.0 / .NET Core?

The method System.Type.GetGenericArguments() is 'missing' from .NETStandard 1.0, and I thought that the TypeInfo.GenericTypeArguments was the replacement for GetGenericArguments() , but unfortuntely they behave differently when supplied with an open generic type. Take for instance the following code:

Type type = typeof(ICommandHandler<>);
type.GetGenericArguments(); // return { TCommand }
type.GetTypeInfo().GenericTypeArguments; // returns empty array

While the GetGenericArguments() method returns the generic type argument TCommand , the GenericTypeArguments simply returns an empty array for the same open-generic type.

What is the exact behavior of GenericTypeArguments and what's the equivalent of Type.GetGenericArguments() in .NET Standard 1.0?

After further investigation, the Type.GenericTypeArguments seems to only return anything if the type isn't a generic type definition. The TypeInfo.GenericTypeParameters on the other hand, only returns any if the type is a generic type definition.

The following code mimics the behavior of Type.GetGenericArguments() :

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

This may turn out to be a comment (not an answer) after all.

On .NET 4.6.1, there are two members on System.Type , namely:

/* 1 */ type.GetGenericArguments()               // returns { TCommand, }

/* 2 */ type.GenericTypeArguments                // returns empty array

plus one member on System.Reflection.TypeInfo , namely:

/* 3 */ type.GetTypeInfo().GenericTypeParameters // returns { TCommand, }

for a total of three members.

However, the two first-mentioned members are also inherited by System.Reflection.TypeInfo , a subclass of System.Type .

On .NET 4.6.1, when you do type.GetTypeInfo().GenericTypeArguments (as in your question), you really call the property on Type , ie my member marked /* 2 */ .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM