c# - 通过指出来获取方法的名称?

标签 c# .net reflection

我有一个看起来像这个MyClass.SpecialMethod()的成员,我需要将此方法的名称作为字符串发送给另一个方法。我知道我可以使用TypeOf.GetMethods(..).Name,但是..将被硬编码,如果SpecialMethod更改名称,将出现问题。

所以我想做的是这样的

TypeOf(MyClass).GetMethod(MyClass.SpecialMethod).Name


这是可能的,如果是这样,怎么办?

我知道我可以从方法内部获取当前方法的名称,但是到现在为止。

最佳答案

如果可以将nameof()用作Jason suggested,请继续使用它。

如果您不这样做,请编写以下帮助程序方法:

class MyClass {
    public void SpecialMethod() {
        var myName = WhatIsMyName();
    }

    private static string WhatIsMyName([CallerMemberName] string name= "") {
        return name;
    }
}


有关详细信息,请参见MSDN。请注意,如果调用方方法被重载,您将获得其名称,但名称不明确。

较旧的C#版本不支持此功能(.NET 4.5中已引入)。如果您必须与他们打交道,那么您可能需要使用堆栈走动的旧技巧来检查成员名称,大致是这样的:

[MethodImpl(MethodImplOptions.NoInlining)]
private static string WhatIsMyName() {
    return new StackTrace().GetFrame(1).GetMethod().Name;
}


(请注意[MethodImpl(MethodImplOptions.NoInlining)]以防止内联,否则,如果内联此调用,您将跳过(GetFrame(1)而不是GetFrame(0))要使用其名称的方法。

请注意,所有这些技术(堆栈遍历,调用者信息,表达式)实际上都需要显式调用另一个在编译时解析nameof()的方法。这可能是性能上的巨大差异(如果有问题的话)。

关于c# - 通过指出来获取方法的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30801042/

相关文章:

c# - FileSystemWatcher.Filter - 在缓冲区之前还是之后?

c# - 将 IList 或 IEnumerable 转换为数组的最佳方法

Python .net 框架引用参数 Double[]&

c# - 如何让 TagLib# 处理扩展名错误的文件?

.net - C# 中 get 前缀背后的原因

java - 分析方法内部的变量。 JavaParser/ANTLR 或其他?

c# - .NET Flag Enum 从值中获取属性

c# - 有人更改 Visual Studio 默认的支撑样式吗? - 有标准吗?

.net - 从 XPath 表达式返回 bool 值

pointers - 如何将一个 reflect.Type 转换为它的 ptr 类型?