枚举扩展方法未显示

时间:2014-03-05 06:05:14

标签: c# enums

我正在尝试为Enum添加新的/扩展方法,但是在intellisense方法列表中没有显示扩展方法。请帮助我的代码。

扩展:

public static class EnumExtensions
    {
        public static string GetDescriptionAttr(this Enum value,string key)
        {
            var type = value.GetType();
            var memInfo = type.GetMember(key);
            var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute),
                false);
            var description = ((DescriptionAttribute)attributes[0]).Description;
            return description;
        }
    }

尝试从其他类调用结果(调用者和扩展名都在同一个项目中)

enter image description here

3 个答案:

答案 0 :(得分:4)

扩展方法只能应用于实例

public static class EnumExtensions {
  // This extension method requires "value" argument
  // that should be an instance of Enum class 
  public static string GetDescriptionAttr(this Enum value, string key) {
    ...
  }
}

...

public enum MyEnum {
  One, 
  Two,
  Three
}

Enum myEnum = MyEnum.One;

// You can call extension method on instance (myEnum) only
myEnum.GetDescriptionAttr("One");

答案 1 :(得分:3)

您应该对枚举实例使用扩展方法。 我有这个代码,它可以正常工作:

public static string GetDescription(this Enum value)
{
    var attributes = 
        (DescriptionAttribute[])value.GetType().GetField(value.ToString())
        .GetCustomAttributes(typeof(DescriptionAttribute), false);
    return attributes.Length > 0 ? attributes[0].Description : value.ToString();
}

使用此方法显示在此处:

MyEnum myE = MyEnum.OneOfItemsOfEnum;
string description = myE.GetDescription();

答案 2 :(得分:0)

我有这个变体

using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;

namespace Web.Extensions
{
    public static class EnumExtension
    {
        public static string GetDisplayName(this Enum enumValue)
        {
            var displayName = enumValue.GetType()?
                .GetMember(enumValue.ToString())
                .FirstOrDefault()?
                .GetCustomAttribute<DisplayAttribute>()?
                .Name;

            return displayName ?? enumValue.ToString();
        }
    }
}

枚举定义

public enum SomeEnum
    {
        One= 1,
        [Display(Name = "Second")]
        Two= 2,
        Three= 3
    }

并在视图中(直接调用扩展名)。

display name from enum
@Web.Extensions.EnumExtension.GetDisplayName(Domain.Enums.SomeEnum.Two)
show display name from enum id
@Web.Extensions.EnumExtension.GetDisplayName((Domain.Enums.SomeEnum)2)
show display name from enum id without display attribute
@Web.Extensions.EnumExtension.GetDisplayName((Domain.Enums.SomeEnum)3)

输出

Second
Second
Three

或更简单地

@using Web.Extensions
@using Domain.Enums

@SomeEnum.Two.GetDisplayName()
@(((SomeEnum)2).GetDisplayName())