我想将一个方法(Foo)传递给一个返回一个动作(或一个委托)(Bar)的函数,并让该函数构造一个新的Action(或委托):就像声明一个委托一样:
delegate FooDelegate( );
然后你可以说
//In this case, Foo is a method name which has been passed to a constructor.
FooDelegate MyFooDelegate = new FooDelegate( Foo );
所以不必说
FooDelegate VarNameHere = new FooDelegate( MethodNameHere );
我希望能够说
FooDelegate VarNameHere = MyFooDelegator( MethodNameHere )
并让MyFooDelegator成为一个函数,它返回 无论 类型的委托(该类型与问题无关):
public FooDelegate MyFooDelegator( method MethodToFooDelegate ){
return new FooDelegate( MethodToFooDelegate );
}
这可能吗?
答案 0 :(得分:2)
听起来你想将任意方法包装到你的辅助函数中(类似于许多依赖注入框架的拦截行为,如Unity)。
确实有可能 - 最简单的方法是有几个函数包含0-n参数函数:
Func<TResult> Wrap<TResult>(Func<TResult> inner)
{
return () =>
{
//BeforeCall();
var r = inner();
//AfterCall();
return r;
};
}
Func<TArg1, TResult> Wrap<TArg1, TResult>(Func<TArg1, TResult> inner)
{
return (arg1) =>
{
//BeforeCall();
var r = inner(arg1);
//AfterCall();
return r;
};
}
并使用如下:
// int R1(int z){return 42;}
var wrapped = Wrap(MethodNameHere);
var wrappedOneArg = Wrap<int,int>(R1);
您也可以编写代码来构建更通用的包装器,但您可能需要使用表达式树甚至直接建立IL。
注意:最新版本的C#(3+?)允许传递方法名称,在旧版本中需要转换为委托。