2

我想知道 C# 中是否有一种方法可以执行方法,如果我们只有它的名称在字符串中?

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

类似的东西?

谢谢 :)

4

7 回答 7

2

尝试这个:

Type t = Type.GetType(typeName);
t.InvokeMember("method", BindingFlags.InvokeMethod | BindingFlags.Public, null, null, null);
于 2012-04-26T13:38:39.280 回答
0

就像是

Type type = GetType("MyType");
MethodInfo methodInfo = type.GetMethod(methodName);
methodInfo.Invoke()
于 2012-04-26T13:38:01.257 回答
0

我用了这样的东西:

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

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

希望能帮助到你

于 2012-04-26T13:38:31.623 回答
0

这个例子有你正在寻找的东西,即:

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

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

于 2012-04-26T13:38:38.150 回答
0

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

检查反射:如何使用参数调用方法

于 2012-04-26T13:38:50.327 回答
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);
            }
于 2012-04-26T13:44:14.120 回答
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 调用

字符串 A 调用

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

于 2012-04-26T13:50:01.210 回答