Что эквивалентно 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 */
.