如何将任何方法作为另一个函数的参数传递

时间:2011-12-26 19:25:23

标签: c# methods delegates parameter-passing

在A班,我有

internal void AFoo(string s, Method DoOtherThing)
{
    if (something)
    {
        //do something
    }
    else
        DoOtherThing();
}

现在我需要能够将DoOtherThing传递给AFoo()。我的要求是DoOtherThing可以有任何返回类型的签名几乎总是无效。类似于B类的东西,

void Foo()
{
    new ClassA().AFoo("hi", BFoo);
}

void BFoo(//could be anything)
{

}

我知道我可以用Action或者通过实现代表来实现这一点(如许多其他SO帖子中所见)但是如果B类函数的签名未知,怎么能实现呢?

3 个答案:

答案 0 :(得分:9)

您需要传递delegate个实例; Action可以正常工作:

internal void AFoo(string s, Action doOtherThing)
{
    if (something)
    {
        //do something
    }
    else
        doOtherThing();
}

如果BFoo是无参数的,它将按照您的示例中的说明运行:

new ClassA().AFoo("hi", BFoo);

如果需要参数,您需要提供参数:

new ClassA().AFoo("hi", () => BFoo(123, true, "def"));

答案 1 :(得分:2)

如果您需要返回值,请使用操作 Func

操作: http://msdn.microsoft.com/en-us/library/system.action.aspx

FUNC: http://msdn.microsoft.com/en-us/library/bb534960.aspx

答案 2 :(得分:0)

public static T Runner<T>(Func<T> funcToRun)
{
    //Do stuff before running function as normal
    return funcToRun();
}

用法:

var ReturnValue = Runner(() => GetUser(99));

我在MVC网站上使用它进行错误处理。