【问题标题】:How to get the methodname from a known method?如何从已知方法中获取方法名?
【发布时间】:2013-08-27 03:50:47
【问题描述】:

是否可以在同一类中获取另一个方法的名称,但没有使用手动编写的字符串?

class MyClass {

    private void doThis()
    {
        // Wanted something like this
        print(otherMethod.name.ToString());
    }   

    private void otherMethod()
    {

    }
}

你可能会问为什么:好吧,原因是我必须稍后像这个 Invoke("otherMethod") 一样调用该方法,但是我不想自己硬编码这个字符串,因为我不能再在项目。

【问题讨论】:

  • 你可以使用反射来实现。
  • 你使用的是什么版本的 C#?

标签: c# invoke method-names


【解决方案1】:

一种方法是您可以将其包装到委托Action,然后您可以访问方法的名称:

string name = new Action(otherMethod).Method.Name;

【讨论】:

  • 感谢这项工作!该死的我查看了 GetType() 和 GetMethods() 但我从未听说过这个“新动作”。小问题:当我使用新的 Action 时,我希望其中的方法不会被执行(它只需要名称),对吗?
  • 如果您使用委托方法,则不需要获取名称(因此跳过通过反射调用) - 只需使用生成的 Action 稍后执行方法。
  • 哇!太棒了,我不知道你能做到。
  • 太棒了!再次感谢!
  • @Malvin:您也可以使用expression templates 来实现与字段/属性/等类似的目标,尽管 Cuong 的解决方案更适合这里的方法。
【解决方案2】:

您可以使用反射(例如 - http://www.csharp-examples.net/get-method-names/)来获取方法名称。然后,您可以通过名称、参数甚至使用属性对其进行标记来查找您要查找的方法。

但真正的问题是 - 你确定这是你需要的吗?这看起来好像你真的不需要反思,但需要考虑你的设计。如果您已经知道要调用什么方法,为什么还需要名称?使用委托怎么样?还是通过接口公开方法并存储对实现它的某个类的引用?

【讨论】:

    【解决方案3】:

    试试这个:

    MethodInfo method = this.GetType().GetMethod("otherMethod");
    object result = method.Invoke(this, new object[] { });
    

    【讨论】:

      【解决方案4】:

      顺便说一句。我还发现(在互联网的扩展中)仅获取方法字符串的替代解决方案。它也适用于参数和返回类型:

      System.Func<float, string> sysFunc = this.MyFunction;
      string s = sysFunc.Method.Name; // prints "MyFunction"
      
      public string MyFunction(float number)
      {
          return "hello world";
      }
      

      【讨论】:

      • 唯一的区别是,这也适用于非 void 方法。
      • 方法是相同的,你显然需要使用与方法签名匹配的Action/Func 类型。 OP 中的示例是无参数的 void 函数,即Action。您不能Func 用于这种方法。
      • 你是对的,它基于相同的根源。我只是为了提醒而添加了它,因为我还不是 C# 专业。
      猜你喜欢
      • 2012-03-27
      • 2015-05-22
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多