C#:返回给定对象和方法名称的委托

假设我有一个对象和一个包含方法名称的字符串,我该如何将委托返回给该方法(该方法?)?

例:

MyDelegate GetByName(ISomeObject obj, string methodName) { ... return new MyDelegate(...); } ISomeObject someObject = ...; MyDelegate myDelegate = GetByName(someObject, "ToString"); //myDelegate would be someObject.ToString 

提前致谢。

还有一件事 – 我真的不想使用switch语句,即使它可以工作但是需要很多代码。

您需要使用Type.GetMethod来获取正确的方法,并使用Delegate.CreateDelegateMethodInfo转换为委托。 完整示例:

 using System; using System.Reflection; delegate string MyDelegate(); public class Dummy { public override string ToString() { return "Hi there"; } } public class Test { static MyDelegate GetByName(object target, string methodName) { MethodInfo method = target.GetType() .GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy); // Insert appropriate check for method == null here return (MyDelegate) Delegate.CreateDelegate (typeof(MyDelegate), target, method); } static void Main() { Dummy dummy = new Dummy(); MyDelegate del = GetByName(dummy, "ToString"); Console.WriteLine(del()); } } 

Mehrdad的评论很棒 – 如果Delegate.CreateDelegate的这个重载抛出的exception没问题,你可以显着简化GetByName

  static MyDelegate GetByName(object target, string methodName) { return (MyDelegate) Delegate.CreateDelegate (typeof(MyDelegate), target, methodName); } 

我自己从来没有使用过这个,因为我通常在明确找到MethodInfo之后会做其他检查 – 但是它适合,这真的很方便:)

 static MyDelegate GetByName(object obj, string methodName) { return () => obj.GetType().InvokeMember(methodName, System.Reflection.BindingFlags.InvokeMethod, null, obj, null); } 

更容易使用:

  public static MyDelegate GetByName(object target, string methodName) { return (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), target, methodName); } 

请注意,CreateDelegate有一个重载,它为您获取methodName。 这是通过.net 3.5 Sp1完成的