2012-04-26 103 views
2

我想知道是否有一種方法在C#執行一個方法,如果我們只有它的名稱在一個字符串?如何評估一個函數傳遞的字符串在C#

string methodname="method" 
this.RunMethod(methodname) 

這樣的事情?

謝謝:)

+0

你需要的類型名稱也 – 2012-04-26 13:36:53

+0

和關鍵字搜索是'反射' – 2012-04-26 13:37:39

+0

@AdrianIftode:類型將是'this.GetType()' – spender 2012-04-26 13:37:54

回答

0

您可以創建一個通用的方法來調用在任何情況下他們的名字方法,你要這樣說:

public void RunMethodOn(object obj, String methodName,params Object[] args) 
     { 
      if(obj != null) 
      { 
       System.Reflection.MethodInfo method = null; 
       method = obj.GetType().GetMethod(methodName); 
       if (method != null) 
        method.Invoke(obj, args); 
      } 
     } 

而且使用它來調用一個方法對你自己的實例你問:

public void RunMethod(String methodName,params Object[] args) 
      { 
        ExecuteOn(this, methodName, args); 
      } 
0

喜歡的東西

Type type = GetType("MyType"); 
MethodInfo methodInfo = type.GetMethod(methodName); 
methodInfo.Invoke() 
0

我用seomthing這樣的:

typeof(StringValidator<T>).GetMethod(restriction.Operacion.Nombre).Invoke(null, param) as IList<T>; 

基於包含的方法(StringValidator)之類的類型,然後我得到方法由它的名字限制.Operacion.Nombre,並調用它。

希望它有助於

0

This example有你在找什麼,即:

String s = (String)calledType.InvokeMember(
       methodName, 
       BindingFlags.InvokeMethod | BindingFlags.Public | 
        BindingFlags.Static, 
       null, 
       null, 
       null); 

2

(顯然,這可能取決於返回類型等改變)試試這個:

Type t = Type.GetType(typeName); 
t.InvokeMember("method", BindingFlags.InvokeMethod | BindingFlags.Public, null, null, null); 
+0

只適用於靜態方法。 OP正在嘗試調用實例方法。 – spender 2012-04-26 13:40:33

0

您可以用擴展方法做到這一點非常漂亮:

public static class MethodEx 
{ 
    public static void RunMethod(
     this object target, 
     string methodName, 
     params object[] values) 
    { 
     var type=target.GetType(); 
     var mi = 
      type.GetMethod(methodName,values.Select(v=>v.GetType()).ToArray()); 
     mi.Invoke(target,values); 
    } 
} 

...和如下使用它:

void Main() 
{ 
    var m=new Monkey(); 
    m.RunMethod("A",1); 
    m.RunMethod("A","frog"); 
} 

class Monkey 
{ 
    public void A(int a) 
    { 
     Console.WriteLine("int A called"); 
    } 
    public void A(string s) 
    { 
     Console.WriteLine("string A called"); 
    } 
} 

這將根據提供的PARAMS選擇合適的過載,所以上面的代碼給出的輸出:

INT甲稱爲

串一個名爲

I L爲OP提供了更好的錯誤處理。