我正在开发一个 AngularJS/Asp.Net MVC 项目,并且我有几个枚举的值具有 [Display(Name = "Value")]
属性。我有一个扩展方法,可以从这些方法中提取显示名称,效果很好:
public static string GetDisplayName(this Enum value)
{
Type enumType = value.GetType();
var enumValue = Enum.GetName(enumType, value);
MemberInfo member = enumType.GetMember(enumValue)[0];
var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
var outString = ((DisplayAttribute)attrs[0]).Name;
if (((DisplayAttribute)attrs[0]).ResourceType != null)
{
outString = ((DisplayAttribute)attrs[0]).GetName();
}
return outString;
}
将这些枚举转换为显示名称字符串值的列表非常简单:
//TODO: there *has* to be a way to do this with a generic or extension method
ViewBag.CurrencyTypes = Enum.GetValues(typeof(ProjectName.Web.Models.Common.CurrencyType)).Cast<ProjectName.Web.Models.Common.CurrencyType>().Select(v => v.GetDisplayName()).ToList();
ViewBag.PaymentTypes = Enum.GetValues(typeof(ProjectName.Web.Models.Common.PaymentType)).Cast<ProjectName.Web.Models.Common.PaymentType>().Select(v => v.GetDisplayName()).ToList();
ViewBag.OrgTypes = Enum.GetValues(typeof(ProjectName.Web.Models.Common.OrganizationType)).Cast<ProjectName.Web.Models.Common.OrganizationType>().Select(v => v.GetDisplayName()).ToList();
ViewBag.States = Enum.GetValues(typeof(ProjectName.Web.Models.Common.State)).Cast<ProjectName.Web.Models.Common.State>().Select(v => v.GetDisplayName()).ToList();
我想弄清楚的是,如何创建一个可以创建这些列表的通用扩展方法?我尝试使用泛型,但添加 where T : Enum
会引发错误。
更新:基于 @Marcel's link 的 where T : struct, IConvertible
的类型限制,和the function @empi posted我有这个静态辅助函数:
public static List<string> GetDisplayList<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enumerated type");
}
return Enum.GetValues(typeof(T)).Cast<Enum>().Select(v => v.GetDisplayName()).ToList();
}
有没有办法使它成为扩展方法?
最佳答案
你真的需要扩展方法吗?一个简单的静态方法解决了这个问题:
public static List<string> CreateList<T>()
{
return Enum.GetValues(typeof(T)).Cast<Enum>().Select(v => v.GetDisplayName()).ToList();
}
当谈到通用约束时,你应该看看 Create Generic method constraining T to an Enum正如评论中所述。
关于c# - 创建通用扩展方法来获取值的显示名称属性字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25391795/