2010-08-04 2 views
1

С помощью отражения от типа DerivedClassB мы можем определить:
а), что он использует класс CTOR базы, которая принимает строку параметры
б) фактическое значение, которое она проходит?Использование отражения для определения базового класса вызывается конструктор

public class BaseClass 
{ 
    public BaseClass() 
    {    
    } 

    public BaseClass(string someParameter) 
    {    
    } 
} 

public class DerivedClassA : BaseClass 
{ 
    public DerivedClassA() 
    {    
    } 
} 

public class DerivedClassB : BaseClass 
{ 
    public DerivedClassB(): base("canWeFindThis") 
    {    
    } 
} 

ответ

4

а) Да. Технически вы можете узнать, какие другие конструкторы вызываются, если вы читаете информацию от ConstructorInfo.GetMethodBody(), но без вспомогательной библиотеки, такой как Mono.Cecil, вам придется декодировать IL из массива байтов.

b) В вашем случае, да, но вообще нет. Отражение может использоваться только для отображения статических данных, а не динамического состояния времени выполнения, поэтому вы не сможете использовать его для определения значений, которые были переданы в качестве параметра конструктору, если только он не был указан как литерал, как у вас, в в этом случае вы можете использовать тот же метод выше с ConstructorInfo.GetMethodBody() или Mono.Cecil.

+0

Спасибо. Re b) - потому что в моем примере передаваемая строка является литералом, может ли она быть найдена в IL? – zadam

+0

Да, ты прав. Я обновил свой ответ, чтобы отразить это, так сказать. –

1

В качестве продолжения этого я понял, что значение, передаваемое базовому классу, фактически открывается через свойство в базовом классе.

Итак, для моего сценария я просто создал экземпляр типа, а затем опросил значение свойства, чтобы узнать, что на самом деле было передано в конструкторе. НТН.

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