获取方法名称的类型安全方式

时间:2016-03-12 11:32:06

标签: c# reflection

有没有办法做到这一点:

var methodToDoStuffTo = typeof (FancyClass).GetMethod("MethodName").Name;

不转发字符串"MethodName"

我想要的是这样的:

var methodToDoStuffTo = typeof (FancyClass).GetMethod(FancyClass.MethodName).Name;

因此,我可以确定在重命名方法MethodName时没有意外错误。

由于原因我不能简单地将我的环境更新为c#6,所以没有nameof()

我试着说明为什么我这样做:

我(必须)在几种不同的方法上使用一个Authorization Attribute。 根据属性被“调用”的方法,代码必须执行 slitly 不同的东西。

这就是为什么我不能/不想为每个方法使用不同的属性。

1 个答案:

答案 0 :(得分:2)

  

根据属性被称为'的方法,代码必须做一些不同的东西

你永远不应该这样做。让基于命名约定的神奇事物在大多数应用程序代码中都是一个坏主意,会导致意想不到的副作用。

只需在属性中添加构造函数参数:

public class YourAttribute : Attribute
{
    private bool doSomethingDifferent;

    public YourAttribute(bool doSomethingDifferent = false)
    {
        _doSomethingDifferent = doSomethingDifferent;
    }
}

并按原样应用:

public class AttributeApplication
{
    [YourAttribute]
    public void NormalMethod()
    {
    }

    [YourAttribute(doSomethingDifferent: true)]
    public void MethodSomewhatDifferent()
    {
    }
}

但如果你真的想要一个类型安全的GetMethod(),你可以使用MethodCallExpression创建一个扩展方法,如Get the name of a method using an expression中所述。

语法将变为这样:

var methodToDoStuffTo = typeof(FancyClass).GetMethod(c => c.MethodName()).Name;

但同样,不应轻易选择这种方法。