2015-08-30 43 views
2

我正在使用一个事件系统,它为回调方法名称提取一个字符串。我想避免硬编码字符串。有没有什么办法可以在运行时获得给定类的方法名?如何在运行时获取方法的名称?

类似的东西来:

typeof(MyClass).Name; 

但方法将是完美的。

编辑:

我一直在谷歌上搜索这个问题,所有的结果似乎是找人来获得当前执行方法的名称。这不是我正在寻找的 - 而是我想在同一个类中获得其他方法的名称。

+0

也许你正在寻找[CallerMemberName(https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices。 callermembernameattribute%28V = vs.110%29.aspx)? –

+0

你能提供一个你有的示例代码吗? – Grundy

回答

2

听起来好像你在谈论的是在C#6.0中添加的nameof操作符。

MSDN Documentation

摘录:

用于获得简单(不合格)字符串的变量,类型或成员的名称。当报告代码中的错误,连接模型 - 视图 - 控制器(MVC)链接,触发属性更改的事件等时,通常需要捕获方法的字符串名称。使用nameof有助于在重命名定义时保持您的代码有效。在必须使用字符串文字来引用定义之前,这在重命名代码元素时很脆弱,因为工具不知道要检查这些字符串文字。

一个nameof表达了这种形式:

if (x == null) throw new ArgumentNullException(nameof(x)); 
WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode” 
+0

只是一个说明,它在编译时评估。 –

+0

感谢Smallhacker。不幸的是,我在2.0上,但这个答案绝对是最相关的。 – Vesuvian

1

您正在寻找

System.Reflection.MethodBase.GetCurrentMethod().Name; 

参考MethodBase.GetCurrentMethod Method

返回表示当前正在执行的 方法的MethodBase对象。

编辑:

var str = typeof(MyClass); 
MethodInfo[] info = str.GetMethods(BindingFlags.Public | BindingFlags.Instance); 
+0

我没有使用当前的方法。我想用不同的方法。 – Vesuvian

+0

你的解决方案是正确的,但我不知道如果使用当前方法的名称会影响编译器优化。有时,编译器会摆脱单次使用的方法。我不是说这是因为你的解决方案,但一般来说,如果你尝试使用当前的方法的鬃毛。 – Yogee

+1

@Vesuvian,请清楚你的问题。你是什​​么意思'不同的方法“?如果您已经可以输入方法名称,只要您担心“其他方法”,请将其保存为字符串。 – Yogee

0

对于同样的方法:

MethodBase.GetCurrentMethod().Name; 

对于方法在另一类:

var type = typeof(MyClass); 
MethodInfo[] methodInfos = type.GetMethods(BindingFlags.Public | BindingFlags.Instance); 

然后,您可以使用,例如, methodInfos[0].Name到获取方法的名称。

如果要调用的方法是在同一个班级,你可以做到这一点,如下:如下

如果方法没有返回类型/空

Action action =() => { MethodToBePassed(); }; 

    public static void MethodToBePassed() 
    { 
    } 

    public static void Test(string a, Action action) 
    { 
     action(); 
    } 

说它:

Test("a", action); 

如果方法有返回PARAM

Func<string, int> action = (str) => { return MethodToBePassed(str); }; 

public int MethodToBePassed(string sample) 
{ 
    return 1; 
} 

public static void Test(string a, Func<string, int> action) 
{ 
    int value = action("a"); 
} 
+0

谢谢,虽然这似乎不可靠。现在,不必确保字符串与方法匹配,我需要确保索引与方法位置匹配。 – Vesuvian

+0

@Vesuvian Nope,不依赖索引。GetMethods方法不会按特定顺序返回方法,例如按字母顺序或声明顺序。您的代码不能依赖于返回方法的顺序,因为顺序会有所不同。 –

+0

@Vesuvian检查我的更新 –

相关问题