C#委托与反思

时间:2017-06-24 14:59:49

标签: c# reflection delegates

我试图优化方法而无法找到解决方案..

我有以下课程:

public class X : MyInterface<Model>
{
    public void Execute(Model m) { }
}

我正在尝试调用Execute(...) 我知道X的类型,我知道模型的类型。

这有效:

(here logic to find the correct method).Method.Invoke(InstanceX, new object[] { m });

这不会,但应该更快地运作:

(here logic to find the correct method).Method.CreateDelegate(Expression.GetDelegateType(typeof(m)), instanceX);

错误: 无法绑定到目标方法,因为其签名或安全透明度与委托类型的方法不兼容。

再次;尝试优化,所以任何其他比反射Invoke更快的解决方案都会很酷。

1 个答案:

答案 0 :(得分:2)

没有反射的解决方案(创建委托):

// assuming existence of class BaseModel and class XModel : BaseModel

public interface IBaseClass {
  void Execute(BaseModel model);
}

public abstract class BaseClass<TModel> : IBaseClass where TModel : BaseModel {
  public void Execute(BaseModel model) {
    this.Execute((TModel)model);
  }
  protected abstract void Execute(TModel model);
}

public class X : BaseClass<XModel> {
  protected override Execute(XModel model) {
   ...
  }
}

样本用法:

var typeX = typeof(X);
var typeXModel = typeof(XModel);
var x = (IBaseClass)Activator.CreateInstance(typeX);
x.Execute((BaseModel)Activator.CreateInstance(typeXModel));