2011-02-25 57 views
2

请看看在下面的代码来了解我的问题:如何通过名称获取方法处理程序? (C#)

public class MyClass 
{ 
    public delegate object MyDelegate(object value); 

    public MyDelegate GetMethodByName(string methodName) 
    { 
    // What have to be here? 
    } 

    public object Method1(object value) 
    { 
    // some code here 
    } 

    public object Method2(object value) 
    { 
    // some code here 
    } 

    public object Method3(object value) 
    { 
    // some code here 
    } 
} 

而且地方:

var obj = new MyClass(); 
MyDelegate del = obj.GetMethodByName("Method1"); 
var result = del(someobject); 

那么如何才能得到它的名称的方法处理? (c#)

回答

6
var obj = new MyClass(); 
MyDelegate del = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), obj.GetType().GetMethod("Method1")); 
var result = del(someobject); 
+0

谢谢。它工作正常! – 2011-02-25 17:27:05

-1

使用反射,您可以像这样获取对MethodInfo实例的引用。

MethodInfo[] methodInfos = typeof(MyClass).GetMethods(BindingFlags.Public | 
               BindingFlags.Static); 
    MethodInfo method1 = methodInfos.SingleOrDefault(m => m.Name == "method1"); 
2
public class MyClass 
{ 
    public delegate object MyDelegate(object value); 

    public MyDelegate GetMethodByName(string methodName) 
    { 
     return (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), this.GetType().GetMethod(methodName)); 
    } 

    public object Method1(object value) 
    { 
     throw new NotImplementedException(); 
    } 

    public object Method2(object value) 
    { 
     throw new NotImplementedException(); 
    } 

    public object Method3(object value) 
    { 
     throw new NotImplementedException(); 
    } 
} 
1

看来,你需要动态地构造一个委托到由反射检索的方法。要做到这一点,你可以按如下方式使用CreateDelegate方法。

public MyDelegate GetMethodByName(string methodName) 
{ 
    MethodInfo method = GetType().GetMethod(methodName); // use BindingFlags if method is static/non-public. 
    return (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), method); 
} 

当然,你需要确保的MyDelegate的签名相匹配的是,给定的方法。

1
public class MyClass 
{ 
    public delegate object MyDelegate(object value); 

    MyDelegate del1, del2, del3; 

    public MyClass() 
    { 
     del1 = Method1; 
     del2 = Method2; 
     del3 = Method3; 
     // remaining Ctr code here 

    } 

    public MyDelegate GetMethodByName(string methodName) 
    { 
     if (methodName.Equals("Method1")) 
      return del1; 

     if (methodName.Equals("Method2")) 
      return del2; 

     if (methodName.Equals("Method3")) 
      return del3; 

     return null; 

    } 

    public object Method1(object value) 
    { 
     // some code here 
     return null; 
    } 

    public object Method2(object value) 
    { 
     // some code here 
     return null; 
    } 

    public object Method3(object value) 
    { 
     // some code here 
     return null; 
    } 
} 

如果你想从仅限于您的静态定义的方法来查找,和你没有重载方法方法列表,那么这个解决方案的工作,而无需使用反射的开销。但是,如果您希望解决方案是通用的,或者使用重载的方法,那么您可以像其他帖子中提到的那样使用反射。

相关问题