c# - 创建通用扩展方法来获取值的显示名称属性字符串列表

标签 c# generics enums extension-methods

我正在开发一个 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 linkwhere 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/

相关文章:

c# - 在 MVC 中有条件地显示操作链接

c# - 动态添加新的 lambda 表达式以创建过滤器

c# - 在泛型参数上调用扩展方法(例如 "Union")

java - 枚举的 values()

c# - 延迟的 LINQ 查询执行实际上是如何工作的?

c# - 从多个表创建 LINQ 选择

swift - 可以使用条件来确定泛型的类型吗?

java - 动态调度和通用接口(interface)工厂

C++ 枚举 [字符串] 错误

objective-c - 64 位 NS_OPTIONS 位掩码