C# 在C中使用字符串名动态调用Void方法#

C# 在C中使用字符串名动态调用Void方法#,c#,string,dynamic,methods,invoke,C#,String,Dynamic,Methods,Invoke,我的应用程序当前正在从数据库中读取需要调用的方法列表,并将它们放入字符串中 我希望能够通过名称调用这些方法,并将参数传递给它们 以下是我想要实现的一个简单示例: protected void Page_Load(object sender, EventArgs e) { ... ... string MethodOne = "CombineText"; string WordOne = "Hell

我的应用程序当前正在从数据库中读取需要调用的方法列表,并将它们放入字符串中

我希望能够通过名称调用这些方法,并将参数传递给它们

以下是我想要实现的一个简单示例:

    protected void Page_Load(object sender, EventArgs e)
      {
          ...
          ...
          string MethodOne = "CombineText";
          string WordOne = "Hello";
          string WordTwo = "World";

          CombineText(WordOne, WordTwo);
      }

  public void CombineText(string WordOne, string WordTwo)
      {
          Console.WriteLine(WordOne+" "+WordTwo);
      }
我在网上看到了很多关于调用静态方法的例子,但我不知道如何通过字符串中的名称调用公共Void方法

有人有什么想法吗?非常感谢

您可以使用


假设该方法是当前类型的实例方法:

MethodInfo method = this.GetType().GetMethod(MethodOne);
method.Invoke(this, new[] { WordOne, WordTwo });

你需要看看反射。您需要这样做:

Type type = GetType();
MethodInfo method = type.GetMethod(Method);
Method.Invoke(this, new object[] { WordOne, WordTwo });


我建议使用
开关
,而不是试图根据名称调用该方法

switch(MethodOne)
{
   case "CombineText":
     CombineText(WordOne, WordTwo);
     break;
   default:
     Console.WriteLine("Invalid function: " + MethodOne);
     break;
}

这样做的好处是确保您只接受有效参数,并提供了一种在计算之前对每个函数的输入进行清理的方法(例如,您可能希望为一个函数从WordTwo中删除空格,或者您希望将较长的一个作为第一个参数传入,而不考虑顺序).

您被卡在了哪个部分?您如何知道该方法属于哪个类?它将始终是当前类型吗?您如何知道该方法的签名?字符串是否始终包含具有固定签名的方法?如果没有,您将如何知道参数是什么,它们应该是什么类型,从何处获取它们,等等。还要注意,此模式是代码气味;您应该真正避免将字符串作为代码执行的一般概念,通常有更好的方法。一个
开关
语句就足够了吗?它必须是方法的名称吗?
switch(MethodOne)
{
   case "CombineText":
     CombineText(WordOne, WordTwo);
     break;
   default:
     Console.WriteLine("Invalid function: " + MethodOne);
     break;
}