不幸的是,写入方法的表达式树非常有限。您只能编写静态方法,它们只能引用已经物化的类或方法。(即没有建设者)。
在我完全放弃这个想法之前,我尝试了创建“存根”静态和实例方法的方法,这将调用具有相同名称的被调用者的所有参数的委托。
例如
public class MyClass<Proxy>
{
static Func<MyClass,int,float,long,double,object> <Delegate>Foo
public override object Foo(int a,float b,long c,double d){
return MyClass_Proxy.<Delegate>Foo.Invoke(this,a,b,c,d)
}
}
这样,由于所有内容都已物化,因此表达式树可以引用所有成员。这是一个可怕的 hack,它成长为一个动态代理。在您使用泛型方法或泛型类方法之前,这很有效(我什至会说得很好),然后它就落在了它的脸上。
您可以在这里查看我对这些代理的看法:
https:
//bitbucket.org/mburbea/delegatedproxy/src ProxiedTypeBuilder 和 ProxiedMethodBuilder 完成了基于类或接口创建代理类的大部分艰苦工作。我的问题表面有点严重,因为我需要我的代理方法能够调用它们的基本实现(这是大多数丑陋的代码要做的事情),我想出了一种适合我需要处理的方法具有泛型参数的方法。