在C#中使用String名称动态调用Void方法

时间:2013-01-10 18:44:11

标签: c# string dynamic methods invoke

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

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

这是我想要实现的一个简单例子:

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

我在网上看到很多关于调用静态方法的例子,但我无法弄清楚如何通过字符串中的名称来调用Public Void方法。

有人有什么想法吗?非常赞赏!

4 个答案:

答案 0 :(得分:2)

您可以使用reflection

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

答案 1 :(得分:1)

我建议使用switch,而不是尝试根据其名称调用该方法。

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

这样做的好处是确保您只接受有效的参数,并提供一种在评估之前基于每个函数清理输入的方法(例如,您可能希望从WordTwo中删除一个函数的空格,或者您想要将较长的一个作为第一个参数传递而不管顺序。)。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你需要看一下反思。你需要做这样的事情:

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

http://msdn.microsoft.com/en-us/library/8zz808e6.aspx

http://msdn.microsoft.com/en-us/library/a89hcwhh.aspx