Используйте отражение, чтобы определить, какой конструктор базового класса называется - PullRequest
1 голос
/ 04 августа 2010

Используя отражение для типа DerivedClassB, мы можем определить:
a) что он использует базовый класс ctor, который принимает строковый параметр
b) фактическое значение, которое он передает?

public class BaseClass
{
    public BaseClass()
    {            
    }

    public BaseClass(string someParameter)
    {            
    }
}

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

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

Ответы [ 2 ]

4 голосов
/ 04 августа 2010

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

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

1 голос
/ 05 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...