Что эквивалентно Type.GetGenericArguments() в .NETStandard 1.0/.NET Core?

Метод System.Type.GetGenericArguments() "отсутствует" из .NETStandard 1.0, и я думал, что TypeInfo.GenericTypeArguments заменяет GetGenericArguments(), но, к сожалению, они ведут себя по-разному, когда они поставляются с открытым родовым типом. Возьмем, например, следующий код:

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

В то время как метод GetGenericArguments() возвращает аргумент generic type TCommand, GenericTypeArguments просто возвращает пустой массив для одного и того же открытого типа.

Каково точное поведение GenericTypeArguments и что эквивалентно Type.GetGenericArguments() в .NET Standard 1.0?

Ответы

Ответ 1

После дальнейшего изучения, Type.GenericTypeArguments, кажется, возвращает только что-либо, если тип не является типичным определением типа. TypeInfo.GenericTypeParameters, с другой стороны, возвращает только если тип является типичным определением типа.

Следующий код воспроизводит поведение Type.GetGenericArguments():

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

Ответ 2

В конце концов, это может быть комментарий (а не ответ).

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