我正在尝试为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;
}
}
尝试从其他类调用结果(调用者和扩展名都在同一个项目中)
答案 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())