2011-12-26 78 views
1

在A类,我有如何通过任何方法作为参数其他功能

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

现在我需要能够通过DoOtherThingAFoo()。我的要求是DoOtherThing可以有返回类型的任何签名几乎总是无效的。事情是这样的,从B级,

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

void BFoo(//could be anything) 
{ 

} 

我知道我可以Action或通过实施代表(如在许多其他SO帖子看出),但怎么可能,如果在B类功能的签名是实现这一目标做未知??

+3

如果它有参数,你将如何调用该函数? @erikH从哪个地方起作用? – erikH 2011-12-26 19:28:08

+0

@erikH – nawfal 2011-12-26 19:30:35

+0

@nawfal ???我的意思是例如DoSomething(int,string)作为方法,将需要一些值作为参数... – erikH 2011-12-26 19:34:46

回答

8

您需要通过一个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")); 
+0

纯粹的辉煌,在一次去,因为我看到...编译后的更多言论:) – nawfal 2011-12-26 19:40:39

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

用法:

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

我用这个错误处理在我的MVC的网站。

相关问题