【问题标题】:Dynamically invoking a Void Method with a String name in C#在 C# 中使用字符串名称动态调用 Void 方法
【发布时间】:2013-01-10 18:44:10
【问题描述】:

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

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

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

    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 方法。

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

【问题讨论】:

  • 你卡在哪一部分了?
  • 你怎么知道这个方法属于哪个类?它会一直是当前类型吗?你怎么知道方法的签名?字符串是否总是包含具有固定签名的方法?如果不是,你怎么知道参数是什么,它们应该是什么类型,从哪里得到它们等等。还要注意这种模式是代码异味;你真的应该避免将字符串作为代码执行的一般概念,通常有更好的方法。
  • switch 声明是否足够?它必须是方法的名称吗?

标签: c# string dynamic methods invoke


【解决方案1】:

您可以使用reflection

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

【讨论】:

    【解决方案2】:

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

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

    这具有确保您只接受有效参数的优点,并提供了一种在评估之前基于每个函数清理输入的方法(例如,您可能想从 WordTwo 中为一个函数去除空格,或者您无论顺序如何,都希望将较长的一个作为第一个参数传递。)。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您需要查看反射。你需要做这样的事情:

        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

        【讨论】:

          猜你喜欢
          • 2013-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 2011-05-25
          • 1970-01-01
          • 2012-07-09
          • 1970-01-01
          相关资源
          最近更新 更多