如何评估c#中字符串传递的函数

时间:2012-04-26 13:35:29

标签: c# methods eval

我想知道在c#中是否有办法执行方法,如果我们在字符串中只有它的名字?

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

那样的东西?

谢谢:)

7 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:0)

这样的东西
Type type = GetType("MyType");
MethodInfo methodInfo = type.GetMethod(methodName);
methodInfo.Invoke()

答案 2 :(得分:0)

我使用了这样的东西:

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

基于包含方法(StringValidator)的类的类型,然后我通过它的名称限制获取方法.Operacion.Nombre,并调用它。

希望有所帮助

答案 3 :(得分:0)

This example有你想要的东西:

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

(显然这可能会根据返回类型等而改变。)

答案 4 :(得分:0)

如果方法不是静态的,您需要类型,方法名称和实例

检查Reflection: How to Invoke Method with parameters

答案 5 :(得分: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);
            }

答案 6 :(得分: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");
    }
}

将根据提供的参数选择正确的重载,因此上面的代码给出了输出:

  

int A called

     

字符串A名为

我将更好的错误处理留给了OP。