2012-04-26 99 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提供了更好的错误处理。