在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类函数的签名未知,怎么能实现呢?
答案 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
答案 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网站上使用它进行错误处理。