2015-08-04 3 views
2

Почему .NET Framework обеспечивают какразница между System.Type.GenericTypeArguments и System.Type.GetGenericArguments .NET (в)

System.Type.GenericTypeArguments 

и

System.Type.GetGenericArguments() 

, которые возвращают аргументы типа (как как Type[]) данного родового типа?

Похоже, что свойство и метод раскрывают ту же функциональность, что означает, что интерфейс API имеет избыточные/дублирующие функциональные возможности?

ответ

4
  • GenericTypeArguments property возвращает пустой массив, если тип является универсальным типом Defintion, в то время как GetGenericArguments method возвращает массив с типами для общих аргументов.
  • Объект GenericTypeArguments был добавлен в структуру 4.5.

Свойство GenericTypeArguments фактически реализован для вызова GetGenericArguments, когда тип является реализация универсального типа:

public virtual Type[] GenericTypeArguments { 
    get { 
    if (IsGenericType && !IsGenericTypeDefinition){ 
     return GetGenericArguments(); 
    } else { 
     return Type.EmptyTypes; 
    } 
    } 
} 

Источник: http://referencesource.microsoft.com/#mscorlib/system/type.cs,0aa31a7de47b9dc7

+0

Действительно? Это странно ... если цель GenericTypeArguments похожа на то, что вы говорите, то разве это не логическое?! Какая польза от возвращения пустого массива - с целью указать, является ли тип общим определением типа или нет?! – Veverke

+0

@Veverke: он возвращает массив типов, если тип является реализацией родового типа. 'typeof (List <>). GenericTypeArguments' возвращает пустой массив' typeof (List ) .GenericTypeArguments' возвращает массив, содержащий 'typeof (int)' и 'typeof (List <>). GetGenericArguments()' возвращает массив, содержащий тип для общего аргумента 'T'. – Guffa

+0

oh ... это яснее, хотя это непростая задача, чтобы оставаться на пути с этими именами ... – Veverke

2

Это станет более очевидным, когда вы смотрите на Информация о версии документация в статьях MSDN для этих членов. Свойство GenericTypeArguments поддерживается для WinRT (например, приложений Windows Store), метод GetGenericArguments() - нет.

WinRT вызвало множество изменений в .NET Framework версии 4.5, однако большинство из них не так очевидны. Проекция языка , встроенная в структуру, покрывает большинство принципиальных различий в системе и скрывает тот факт, что WinRT основан на базе COM. Однако, если вы используете Reflection, это нужно было решать совсем по-другому.

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