枚举扩展方法未显示

3

我想为枚举类型添加新的扩展方法,但是在智能提示方法列表中没有显示出扩展方法。请帮助我解决,以下是我的代码。

扩展方法:

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个回答

6

扩展方法只能应用于实例

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
太棒了!感谢您的解释。这解决了我的困惑。 - Jobert Enamno
1
扩展方法是静态的这一事实,使你认为可以静态调用它。 - Kerem Baydoğan

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();

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())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接