Могу ли я создать (добавить) переопределение метода во время выполнения для дочернего класса (reflection / emit?) В C # - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть дочерний класс, который не переопределяет один из базовых методов своего родителя.Я хочу создать это переопределение во время выполнения.Могу ли я сделать это?Я знаю, что можно изменить метод, который уже существует, но это немного отличается.

Предположим, у меня есть:

class MyBaseClass
{
  public bool testMethod() {
    return false;
  }
}

class MyChildClass : MyBaseClass
{
}

...
MyBaseClass p=new MyBaseClas();
MyChildClass child=new MyChildClass();

p.testMethod();      // should always return false
child.testMethod();  // returns false

....  // Do Magic?

// Make child.testMethod(); return true

Если бы MyChildClass создал переопределение testMethod (), я мог быuse Reflection;

// If
class MyChildClass : MyBaseClass
{
  public override bool testMethod() {
    return false;
  }
}
// then I could have
MethodInfo m = typeof(MyChildClass).GetMethod("testMethod");
// and then do reflection stuff to change it

Но m равно нулю.

Можно ли сделать так, чтобы всякий раз, когда экземпляр MyChildClass вызывал testMethod (), он возвращал true?

1 Ответ

0 голосов
/ 07 декабря 2018

Чтобы изменить поведение производного класса во время выполнения, вы должны встроить его в качестве функции класса:

class MyBaseClass
{
  public virtual bool TestMethod() => false; // MUST BE VIRTUAL
}

class MyChildClass : MyBaseClass
{
  public MyChildClass()
  {
    implementation = () => base.TestMethod();
  }
  private Func<bool> implementation = null;
  public override bool TestMethod() => this.implementation();
  public void SetImplementation(Func<bool> f) => this.implementation = f;
}

И теперь вы можете сделать новый MyChildClass и вызвать SetImplementation(()=>true); дляизменить поведение класса.

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