2011-05-20 31 views
3

我有一个包含指向另一个类的委托变量的方法。 我想通过这个委托来调用该类中的方法,但将该方法的名称作为字符串传递给包含委托的方法。如何将方法名称传递给另一个方法并通过委托变量调用它?

这怎么办?使用反射? Func<T>

编辑:

我现在明白反射可能不是最好的解决方案。

这是我有:

private static void MethodContainingDelegate(string methodNameInOtherClassAsString) 
{ 
     _listOfSub.ForEach(delegate(Callback callback) 
     { 
      //Here the first works, but I want the method to be general and 
      // therefore pass the method name as a string, not specfify it. 
      callback.MethodNameInOtherClass(); 
      //This below is what I am trying to get to work. 
      callback.MethodNameInOtherClassAsString();     
      } 
    }); 
} 

所以,基本上,我正在寻找一种方法,使我的回调委托“认识到”我的methodNameInOtherClassAsString实际上是在其他类来执行的方法。

谢谢!

+2

你可以添加一些伪代码吗?我不明白你在问什么! – Nick 2011-05-20 08:58:56

+0

你可以发布一些你的代码吗? – aL3891 2011-05-20 08:59:30

+0

你有什么样的参考?它是一个委托引用,一个包含方法名称的字符串......? – BoltClock 2011-05-20 09:00:01

回答

3

这很简单:

public delegate void DelegateTypeWithParam(object param); 
public delegate void DelegateTypeWithoutParam(); 

public void MethodWithCallbackParam(DelegateTypeWithParam callback, DelegateTypeWithoutParam callback2) 
{ 
    callback(new object()); 
    Console.WriteLine(callback.Method.Name); 
    callback2(); 
    Console.WriteLine(callback2.Method.Name); 
} 

// must conform to the delegate spec 
public void MethodWithParam(object param) { } 
public void MethodWithoutParam() { } 

public void PassCallback() 
{ 
    MethodWithCallbackParam(MethodWithParam, MethodWithoutParam); 
} 

不要紧,什么类做代理变量点。它可以在另一个类中定义 - 没有太大的区别。

我想你甚至可以从委托变量本身查询原始方法的名称而不反射。每个代表都有一个名为Method的财产。

+0

感谢您的回答。我意识到也许反思不是要走的路,而是考虑到Action ,因为我可以将该方法作为方法(动作)传递,而不必考虑从字符串转换。 – kakka47 2011-05-20 16:38:03

2

你可以做这样的事情:

var mi = typeof(Foo).GetMethods().Single(x => x.Name == "Bar"); 
mi.Invoke(foo, null); 

其中foo是你的目标类,酒吧是你要调用的方法。 但是你应该注意到反射会对你的程序性能产生很大的影响。考虑使用强类型代表。

0

假设你有方法名的字符串表示:

var methodInfo = myObject.GetType().GetMethod(myString); //<- this can throw or return null 
methodInfo.Invoke(myObject, new object[n]{parm1, pram2,...paramn}); 

你需要添加一些错误检查显然此,如果可以的话应该使用的GetMethod一个更具体的版本。

相关问题