2011-02-25 33 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; 
    } 
} 

如果你想從僅限於您的靜態定義的方法來查找,和你沒有重載方法方法列表,那麼這個解決方案的工作,而無需使用反射的開銷。但是,如果您希望解決方案是通用的,或者使用重載的方法,那麼您可以像其他帖子中提到的那樣使用反射。

相關問題