通过显示名称查找枚举字段的扩展方法

时间:2013-07-17 10:58:35

标签: c# .net enums extension-methods custom-attributes

我正在寻找一种通过提供显示名称来查找枚举字段的方法。为了查找显示名称,我写了这个剪辑,它返回了适当的字段(如果可用)作为任意类型。

if (!type.IsEnum) throw new ArgumentException("type");
        return (from field in type.GetFields(BindingFlags.Public | BindingFlags.Static)
                    where field.IsDefined(typeof(DisplayNameAttribute))
                let attribute = field.GetCustomAttribute(typeof(DisplayNameAttribute)) as DisplayNameAttribute
                    where attribute != null && attribute.DisplayName.Equals(lookup, StringComparison.InvariantCultureIgnoreCase)
                select (T)field.GetValue(null)).FirstOrDefault();

现在,我想这样称呼它:

MyEnum instance = MyEnum.GetFieldByDisplayName("my friendly name");

我尝试创建一个扩展方法,该方法将“this Type”和“this Enum”作为参数,但它永远不会显示在MyEnum上。我做错了什么?

2 个答案:

答案 0 :(得分:1)

考虑您的首选用途

MyEnum instance = MyEnum.GetFieldByDisplayName("my friendly name");

您正在尝试在枚举类型上定义静态方法,而不是扩展方法。扩展方法出现在 类型的实例上,而不是类型本身。

如果您定义了扩展类型,则可以像

一样使用它
MyEnum instance = MyEnum.SomeValue.GetFieldByDisplayName("my friendly name");

AFAIK您无法定义允许您根据自己的喜好使用它的方法(或其他方法),因为您无法在枚举类型上定义静态方法。

答案 1 :(得分:0)

检查一下 - Enumeration extension methods

要启用扩展方法,重要的是如何编写方法的原型,而不是方法体。

所以,你应该有这样的东西:

public static void Something(this Enum e)
{
    // code here
}