2013-12-07 138 views
3

我有一种情况,我将方法名称作为字符串传递给函数,但我不希望它硬编码。 例如有没有办法在c#中动态获取方法名?

void MyMethodName() 
{ 
    // some code 
} 

void SomeOtherMethod() 
{ 
    SomeExternalLibrary.ExternalClass.FunctionWithStringParameter("MyMethodName"); 
} 

我想是这样的:

FunctionWithStringParameter(MyMethodName.ToString()); 

这样我可以通过“查找所有引用”跟踪方法调用的,我可以使用重构无后顾之忧。

+0

http://stackoverflow.com/questions/2968352/using-system-reflection-to-get-a-methods-full-name 可能的帮助。这就是说,如果你不想使用反射 - 你可以将字符串设置为公共常量。 – Haedrian

+3

您传递方法名称的原因是什么?你是否通过名字查找来调用该方法?相反,尝试使用委托或lambda表达式。 –

+0

我相信你正试图解决错误的问题。如果您需要更好的重构支持,您应该使用像[ReSharper](http://www.jetbrains.com/resharper/)这样的工具来帮助您重新命名和导航超出Visual Studio的能力范围。 –

回答

5

也许最简单的方法是提供一个可以将委托作为参数的过载FunctionWithStringParameter

超载可能是简单的:

void FunctionWithStringParameter(Action d) 
{ 
    FunctionWithStringParameter(d.Method.Name); 
} 

,并调用它是这样的:

FunctionWithStringParameter(MyMethodName); 

要接受不同签名的方法,你就必须要么提供了许多不同的重载,或接受Delegate作为参数,如下所示:

void FunctionWithStringParameter(Delegate d) 
{ 
    FunctionWithStringParameter(d.Method.Name); 
} 

不幸的是,我F你做到这一点,你必须通过指定一个委托类型来调用它:

FunctionWithStringParameter((Action)MyMethodName); 
+0

就是这样,非常感谢。 –

2

这些天使用的一种技术是通过Expression

FunctionWithStringParameter(x => MyMethodName(x)); 

里面你的方法,你可以挑选表达除了获得被称为方法名(并检查它是否是一个简单的方法调用表达式)。

请参阅Retrieving Property name from lambda expression了解如何区分lambda表达式的想法。

+0

FunctionWithStringParameter在外部库中。 –

0

我不知道你正在尝试做的,但引用的方法和属性,当一个方式,以避免“神奇字符串”是做什么做的ASP.NET MVC助手方法做到这一点是这样的:

@Html.TextBoxFor(m=> m.SomeProperty) 

,并做一些辅助性的,可以让你做的事:

string methodName = ReflectionHelper.MethodNameFor<TheTypeWIthTheMethod>(x=> x.TheMethod()) 

的实施将看一些这样的事情:

static string MethodNameFor<T>(Expression<Action<T>> expression) 
{ 
     return ((MethodCallExpression)expression.Body).Method.Name; 
} 
相关问题