3

我有一种情况,我将方法名称作为字符串传递给函数,但我不希望它被硬编码。例如

void MyMethodName()
{
    // some code
}

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

我想要这样的东西:

FunctionWithStringParameter(MyMethodName.ToString());

这样我就可以通过“查找所有引用”来跟踪方法调用,并且可以毫无顾虑地使用重构。

4

3 回答 3

5

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

重载可能很简单:

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

并这样称呼它:

FunctionWithStringParameter(MyMethodName);

要接受具有不同签名的方法,您必须提供许多不同的重载,或者接受Delegate作为参数,如下所示:

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

不幸的是,如果你这样做,你将不得不通过指定一个委托类型来调用它:

FunctionWithStringParameter((Action)MyMethodName);
于 2013-12-07T20:51:13.970 回答
2

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

FunctionWithStringParameter(x => MyMethodName(x));

在您的方法中,您可以将表达式分开以获取被调用的方法名称(并检查它是否是一个简单的方法调用表达式)。

有关如何区分 lambda 表达式的想法,请参阅从 lambda 表达式中检索属性名称。

于 2013-12-07T20:50:01.487 回答
0

我不确定您要做什么,但是在引用方法和属性时避免“魔术字符串”的一种方法是执行 ASP.NET MVC Helpers 方法的操作,如下所示:

@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;
 }
于 2013-12-07T20:52:57.457 回答