如何从已知的方法中获取方法名称?

6

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

class MyClass {

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

    private void otherMethod()
    {

    }
}

你可能会问为什么要这样做:原因是我之后必须像这样调用该方法 Invoke("otherMethod"),但我不想自己硬编码这个字符串,因为在项目内我无法进行重构。


你可以使用反射来实现这个。 - Khanh TO
你使用的是哪个版本的C#? - user541686
4个回答

8

一种方法是可以将其包装到代理Action中,然后您就可以访问方法的名称:

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

1
谢谢,这个可行!我查看了GetType()和GetMethods(),但是这个“new Action”我从未听说过。小问题:当我使用新的Action时,希望其中的方法不会被执行(它只取名称),这是正确的吗? - Malvin
2
如果您选择使用委托方法,您就不需要获取名称(因此可以跳过通过反射调用)- 只需使用生成的“Action”稍后执行该方法即可。 - Alexei Levenkov
2
哇!太棒了,我不知道你可以这样做。 - Dimitar Dimitrov
@Malvin:是的,你说得对,这有点像创建一个新指针来指向你的方法,它不会执行。 - cuongle
1
@Malvin:你也可以使用表达式模板来实现字段/属性等类似目的,尽管Cuong的解决方案更适用于这里的方法。 - user541686

2
您可以使用反射(例如 - http://www.csharp-examples.net/get-method-names/)获取方法名称。然后,您可以通过名称、参数甚至使用属性标记来寻找您要查找的方法。
但是真正的问题是,您确定这就是您需要的吗?看起来好像您不是真正需要反射,而是需要考虑设计。如果您已经知道要调用哪个方法,为什么还需要名称呢?使用委托怎么样?或者通过接口公开方法并存储实现它的某个类的引用呢?

1

试试这个:

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

0

顺便说一下,我在互联网的扩展中还发现了另一种方法,可以仅获取方法的字符串。它也适用于参数和返回类型:

System.Func<float, string> sysFunc = this.MyFunction;
string s = sysFunc.Method.Name; // prints "MyFunction"

public string MyFunction(float number)
{
    return "hello world";
}

唯一的区别是,这也适用于非void方法。 - Malvin
方法是相同的,显然你需要使用与该方法签名匹配的Action/Func类型。OP中的示例是一个无参数void函数,意味着是Action。你不能对这样的方法使用Func - Servy
你说得对,它们基于相同的根源。我只是加了一个提醒,因为我还不太熟练使用C#。 - Malvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接