从C#中的字符串调用函数


145

我知道在php中您可以拨打电话,例如:

$function_name = 'hello';
$function_name();

function hello() { echo 'hello'; }

.NET有可能吗?


2
我看到您的方法public也应该如此。
zapoo

Answers:


268

是。您可以使用反射。像这样:

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);

56
这需要“使用System.Reflection;”。
jptsetung

1
是否可以将其用于调用带有参数的函数:例如,字符串f =“ method(parameter1,parameter2)”;
2015年

感谢@ottobar的答复。我不知道这是否也是我要寻找的东西:我需要在我的C#代码中使用SQL标量函数。我怎么称呼它?
Chagbert 2015年

1
仅供参考,如果您有重载的方法,这将不起作用。
肖恩·奥尼尔

使用上面的代码-调用的方法必须具有访问修饰符-PUBLIC。如果非公开,请使用Binding标志-BindingFlags.NonPublic | BindingFlags.Instance .. Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
西布加斯(Sibgath)

75

您可以使用反射来调用类实例的方法,并进行动态方法调用:

假设您在实际实例中有一个名为hello的方法(this):

string methodName = "hello";

//Get the method information using the method info class
 MethodInfo mi = this.GetType().GetMethod(methodName);

//Invoke the method
// (null- no parameter for the method call
// or you can pass the array of parameters...)
mi.Invoke(this, null);

1
那么“字符串”类中的方法呢?使用框架4
Leandro

36
class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(MyReflectionClass);
            MethodInfo method = type.GetMethod("MyMethod");
            MyReflectionClass c = new MyReflectionClass();
            string result = (string)method.Invoke(c, null);
            Console.WriteLine(result);

        }
    }

    public class MyReflectionClass
    {
        public string MyMethod()
        {
            return DateTime.Now.ToString();
        }
    }

这是没有阶级依赖性的
Leandro

和方法无效?
Kiquenet '19

2

略有切线-如果要分析和评估包含(嵌套!)函数的整个表达式字符串,请考虑使用NCalc(http://ncalc.codeplex.com/和nuget)

例如 从项目文档中稍作修改:

// the expression to evaluate, e.g. from user input (like a calculator program, hint hint college students)
var exprStr = "10 + MyFunction(3, 6)";
Expression e = new Expression(exprString);

// tell it how to handle your custom function
e.EvaluateFunction += delegate(string name, FunctionArgs args) {
        if (name == "MyFunction")
            args.Result = (int)args.Parameters[0].Evaluate() + (int)args.Parameters[1].Evaluate();
    };

// confirm it worked
Debug.Assert(19 == e.Evaluate());

EvaluateFunction委托中,您将调用现有函数。



0
该代码在我的控制台.Net应用程序中有效
class Program
{
    static void Main(string[] args)
    {
        string method = args[0]; // get name method
        CallMethod(method);
    }
    
    public static void CallMethod(string method)
    {
        try
        {
            Type type = typeof(Program);
            MethodInfo methodInfo = type.GetMethod(method);
            methodInfo.Invoke(method, null);
        }
        catch(Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            Console.ReadKey();
        }
    }
    
    public static void Hello()
    {
        string a = "hello world!";
        Console.WriteLine(a);
        Console.ReadKey();
    }
}

欢迎来到SO!我喜欢您的回答,您能再解释一下您在做什么吗?
a.deshpande012

嗨,当然。这是一个控制台.net应用程序,在“程序类”中有几种方法或函数,例如:hello,hello2,hello2。方法“ CallMethod(string method)”将搜索并让我调用“程序类”内部的任何方法,该方法将其命名为字符串参数。当我从“ Windows控制台”执行应用程序时:我写:“名称应用程序” +“我需要调用的方法”。例如:myapp hello,然后返回“ hello world!”。也可以是“ myapp hello2”或“ myapp hello3”。我认为可以在任何.Net应用程序中使用。
ranobe

您必须添加Reflection类:“ using System.Reflection;”。
ranobe

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.