2010-12-21 54 views
1

我需要传递一个委托和委托应该调用的方法名称作为类构造函数的参数我该怎么做?使用通用委托在不同的类中调用多个方法

也就是说,如果

public delegate object CCommonDelegate(); 

是我的委托,并说,它可以调用下面这个签名

string Method1(); 

object Method2(); 

class X 
{ 
    public X(CCommonDelegate,"MethodName to invoke"){} //how to pass the Method name here.. 

} 

PS任何方法:忽略访问修饰符

回答

4

委托是持有变量可以调用的东西。如果X是需要能够调用的东西类,那么它所需要的是委托:

public delegate object CommonDelegate(); 

class X 
{ 
    CommonDelegate d; 

    public X(CommonDelegate d) 
    { 
     this.d = d; // store the delegate for later 
    } 
} 

后来,它可以调用委托:

var o = d(); 

顺便说一句,你不”不需要定义这样的代表。 Func<Object>类型已经存在,并且具有正确的结构。

构建X给出你的两个实例方法:

string Method1() 
object Method2() 

可以说

var x = new X(obj.Method2); 

哪里obj是具有Method2的类的对象。在C#4中,您可以对Method1执行相同的操作。但在3你需要使用拉姆达转换:

var x = new X(() => obj.Method1); 

这是因为返回类型不完全相同:它通过继承相关。这只会在C#4中自动运行,并且只有在您使用Func<object>时才会生效。

+0

我将能够使用这张异步调用? – 2010-12-21 15:37:42

+0

你可以在任何委托上启动BeginInvoke来启动它在线程池上的执行。你是否应该是另一回事! http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx – 2010-12-21 15:44:30

2

为什么不只是有你的构造采取Func< object>

public class x 
{ 
    public x(Func<object> func) 
    { 
      object obj = func(); 
    } 
} 

然后

x myX = new x(()=> "test"); 
相关问题