2016-08-31 8 views
1

я просматривал исходный код System.Linq.Expressions на GitHub и нашел following codeне Может ConstructorInfo иметь не DeclaringType

public static NewExpression New(ConstructorInfo constructor, IEnumerable<Expression> arguments) 
{ 
    ContractUtils.RequiresNotNull(constructor, nameof(constructor)); 
    ContractUtils.RequiresNotNull(constructor.DeclaringType, nameof(constructor)); 

    // ... 
} 

Я был смущен второй проверки нулевой, поэтому пошел в MSDN. Он должен был сказать следующее о ConstructorInfo.DeclaringType:

Свойство DeclaringType извлекает ссылку на объект Type для типа, объявляющего этого элемента. Элемент типа либо объявляется типом, либо унаследован от базового типа, поэтому объект Type, возвращаемый свойством DeclaringType, может быть не таким же, как объект Type, используемый для получения текущего объекта MemberInfo.

Если объект Type, из которого был получен этот объект MemberInfo, не объявил этот элемент, свойство DeclaringType будет представлять собой один из его базовых типов.

Если объект MemberInfo является глобальным членом (то есть, если он был получен из метода Module.GetMethods, который возвращает глобальные методы в модуле), возвращаемый DeclaringType будет иметь значение null.

Похоже, что DeclaringType может быть нулевым для MemberInfo (класса, из которого получен ConstructorInfo). Но я не уверен, может ли он быть null или нет для ConstructorInfo.

Так мои вопросы:

  1. Может ConstructorInfo.DeclaringType когда-либо быть пустым? Почему код System.Linq.Expressions проверяет его?

  2. Если DeclaringType может быть нулевым, можете ли вы привести пример?

  3. Если DeclaringType может быть нулевым, означает ли это, что среда CLR поддерживает глобальные конструкторы? (Я попытался исследовать это, но ничего не могу найти)

+1

3) Да - Поиск Инициализатора модуля или Конструктора модуля – thehennyy

ответ

1

Вот исходный код для ConstructorInfo.DeclaringType:

public override Type DeclaringType 
{ 
    get 
    { 
     return m_reflectedTypeCache.IsGlobal ? null : m_declaringType; 
    } 
} 

Я не конкретный пример такого сценария, но, учитывая, что это класс ConstructorInfo, мне кажется, это совершенно ясно, что это было специально написано с возможностью, что его свойство DeclaringType могло бы вернуть null.

Я сомневаюсь, что это может произойти с кодом C#, но среда CLR поддерживает широкий спектр языков. C++/CLI кажется наиболее вероятным виновником для этого сценария, поскольку сборка C++/CLI завершается связкой шаблонов и глобальных членов, но VB.NET также делает некоторые глобальные вещи. Предположительно, можно было бы генерировать IL напрямую, что также создало бы эту ситуацию.

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

  • Нет связанных вопросов^_^