2016-08-24 4 views
14

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

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

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

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

+3

@DavidL: .NETStandard это [он .NET стандартной библиотека является формальной спецификацией .NET API, которые предназначены, чтобы быть доступны на всех .NET Среда выполнения] (https://docs.microsoft.com/en-us/dotnet/articles/standard/library). .NET 1.0 - ooooold, а .NETStandard - новый; новый PCL будет более точным. – Steven

+0

Примечание: один стандарт, а один - реализация стандарта. Из статьи: «.NET Core 1.0 реализует .NET Standard Library 1.6» – AaronLS

+0

Кроме того, согласно этой таблице единственной версией .NET Standard 1.0 был Windows Phone Silverlight 8.0. – AaronLS

ответ

11

После дальнейших исследований, 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 */.

+0

Это интересное наблюдение. К сожалению, это не отвечает на мой вопрос. Любая идея, как получить аргументы открытого общего типа в .NET Standard 1.0? – Steven

+0

@Steven Нет, к сожалению нет. Если я правильно понимаю комментарий Скотта Чемберлена на ваш вопрос, возможно, это может вдохновить кого-то на решение для .NET Standard 1.5 (_edit: _ возможно даже .NET Standard 1.1) или более поздней версии. Как запутать три имени: «GetGenericArguments()», «GenericTypeArguments» и «GenericTypeParameters». В некоторых смыслах Microsoft .NET Framework стала беспорядочной. Является ли цель «.NET Standard» (также) убирать такие вещи? –

Смежные вопросы