我可以在运行时为C#中的子类创建(添加)方法重写(反射/发出吗?)。

时间:2018-12-06 18:06:18

标签: c# reflection

我有一个子类,它不会覆盖其父类的基方法之一。我想在运行时创建该替代。我可以这样做吗?我知道可以修改已经存在的方法,但这有点不同。

假设我有

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()的覆盖,则可以使用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 :(得分:0)

要在运行时修改派生类的行为,您应该将其内置为类的功能:

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);来更改类的行为。