【问题标题】:How to evaluate a function passed by a string in c#如何在c#中评估由字符串传递的函数
【发布时间】:2012-05-07 06:06:47
【问题描述】:

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

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

类似的东西?

谢谢:)

【问题讨论】:

  • 并且要搜索的关键字是'Reflection'
  • @AdrianIftode:类型为this.GetType()
  • 是的,你可以,但我会提醒你不要这样做。反射是一个非常强大的工具,但并不适合日常使用。通常,您仅在构建动态基础架构/框架时才需要它。但对于日常业务解决方案而言,使用通用设计模式封装更改就足以解决问题。

标签: c# methods eval


【解决方案1】:

您可以使用扩展方法很好地做到这一点:

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。

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 只适用于静态方法。 OP 正在尝试调用实例方法。
    【解决方案3】:

    您可以创建一个泛型方法,以通过这种方式在任何您想要的实例上按名称调用方法:

    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);
                }
    

    【讨论】:

      【解决方案4】:

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

      查看Reflection: How to Invoke Method with parameters

      【讨论】:

        【解决方案5】:

        This example 有你要找的东西:

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

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

        【讨论】:

          【解决方案6】:

          我用过这样的东西:

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

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

          希望对你有帮助

          【讨论】:

            【解决方案7】:

            类似

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

            【讨论】:

              猜你喜欢
              • 2018-05-05
              • 2010-11-04
              • 1970-01-01
              • 2016-07-26
              • 1970-01-01
              • 2017-04-17
              • 2013-12-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多