有没有办法将方法名称传递给函数,并让该函数返回封装该方法的委托?

时间:2016-05-30 01:55:59

标签: c# delegates

我想将一个方法(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 );
}

这可能吗?

1 个答案:

答案 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+?)允许传递方法名称,在旧版本中需要转换为委托。