【问题标题】:Enum Description to String枚举描述到字符串
【发布时间】:2014-02-19 14:28:37
【问题描述】:

我有以下 ENUM:

[Flags]
public enum DataFiat {

  [Description("Público")]
  Public = 1,

  [Description("Filiado")]
  Listed = 2,

  [Description("Cliente")]
  Client = 4

} // DataFiat

我创建了一个扩展来获取枚举属性:

public static T GetAttribute<T>(this Enum value) where T : Attribute {

  T attribute;
  MemberInfo info = value.GetType().GetMember(value.ToString()).FirstOrDefault();
  if (info != null) {
    attribute = (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault();
    return attribute;
  }
  return null;
}

这适用于非标志枚举...但是当我有时:

var x = DataFiat.Public | DataFiat.Listed;
var y = x.GetAttribute<Description>();

y 的值为 null ...

我想获得“Público, Filiado, Cliente”...就像 ToString() 一样。

如何更改我的扩展程序以使其正常工作?

谢谢

【问题讨论】:

  • Break the flags down into the individual values,获取每个单独值的属性并建立一个字符串。
  • 但它在这里不起作用,因为您的扩展方法只返回 1 个值,但是您想要做的是返回一个值列表。否则扩展方法需要知道如何组合这些属性
  • 如果您希望说英语的人使用它,它不会很好地本地化。

标签: c# enums


【解决方案1】:

你可以使用this:

var values = x.ToString()
             .Split(new[] { ", " }, StringSplitOptions.None)
             .Select(v => (DataFiat)Enum.Parse(typeof(DataFiat), v));

获取单个值。然后获取它们的属性值。

类似这样的:

var y2 = values.GetAttributes<DescriptionAttribute, DataFiat>();

public static T[] GetAttributes<T, T2>(this IEnumerable<T2> values) where T : Attribute
{
    List<T> ts =new List<T>();

    foreach (T2 value in values)
    {
        T attribute;
        MemberInfo info = value.GetType().GetMember(value.ToString()).FirstOrDefault();
        if (info != null)
        {
            attribute = (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault();
            ts.Add(attribute);
        }
    }

    return ts.ToArray();
}

【讨论】:

  • 这是一个选项...但我想将 ToString() 的功能复制到 Flags 枚举...它返回以逗号分隔的字符串
  • @MDMoura:这对你有用吗?
【解决方案2】:

在 .NET CORE 中无需任何其他库即可:

 public enum Divisions
 {
    [Display(Name = "My Title 1")]
    None,
    [Display(Name = "My Title 2")]
    First,
 }

并获得标题:

using System.ComponentModel.DataAnnotations
using System.Reflection

string title = enumValue.GetType()?.GetMember(enumValue.ToString())?[0]?.GetCustomAttribute<DisplayAttribute>()?.Name;

【讨论】:

    【解决方案3】:

    我想你想做这样的东西

    using System;
    
    public enum ArrivalStatus { Unknown=-3, Late=-1, OnTime=0, Early=1 };
    
    public class Example
    {
       public static void Main()
       {
          int[] values = { -3, -1, 0, 1, 5, Int32.MaxValue };
          foreach (var value in values)
          {
             ArrivalStatus status;
             if (Enum.IsDefined(typeof(ArrivalStatus), value))
                status = (ArrivalStatus) value;
             else
                status = ArrivalStatus.Unknown;
             Console.WriteLine("Converted {0:N0} to {1}", value, status);
          }
       }
    }
    // The example displays the following output:
    //       Converted -3 to Unknown
    //       Converted -1 to Late
    //       Converted 0 to OnTime
    //       Converted 1 to Early
    //       Converted 5 to Unknown
    //       Converted 2,147,483,647 to Unknown
    

    【讨论】:

      【解决方案4】:
      using System.Collections.Generic;
      using System.Collections.ObjectModel;
      using System.ComponentModel;
      
      public static class Program
      {
      [Flags]
      public enum DataFiat
      {
      
        [Description("Público")]
        Public = 1,
      
        [Description("Filiado")]
        Listed = 2,
      
        [Description("Cliente")]
        Client = 4
      
      } 
      
      public static ICollection<string> GetAttribute<T>(this Enum value)
      {
        var result = new Collection<string>();
        var type = typeof(DataFiat);
      
        foreach (var value1 in Enum.GetValues(type))
        {
          var memInfo = type.GetMember(value1.ToString());
          var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
          var description = ((DescriptionAttribute)attributes[0]).Description;
          result.Add(description);
        }
      
        return result;
      }
      
      static void Main(string[] args)
      {
        var x = DataFiat.Public | DataFiat.Listed;
        var y = x.GetAttribute<DataFiat>();
      
        var output = string.Join(" ", y.ToArray());
        Console.WriteLine(output);
      }
      }
      

      我已将 T 更改为 ICollection,但您可以根据需要更改它,或者您可以合并方法中的数据并返回字符串。

      【讨论】:

        【解决方案5】:

        我根据我之前的代码想出了一个不同的解决方案。可以这样使用:

          DataFiat fiat = DataFiat.Public | DataFiat.Listed;
          var b = fiat.ToString();
          var c = fiat.GetAttributes<TextAttribute>();
        
          var d = fiat.GetAttributes<TextAttribute, String>(x => String.Join(",", x.Select(y => y.Value)));
        

        我认为获取属性或使用它们做某事变得很容易。

        你怎么看?

        如果代码可以改进,请告诉我。代码如下:

        public static List<T> GetAttributes<T>(this Enum value) where T : Attribute {
        
          List<T> attributes = new List<T>();
        
          IEnumerable<Enum> flags = Enum.GetValues(value.GetType()).Cast<Enum>().Where(value.HasFlag);
        
          if (flags != null) {
        
            foreach (Enum flag in flags) {
              MemberInfo info = flag.GetType().GetMember(flag.ToString()).FirstOrDefault();
              if (info != null)
                attributes.Add((T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault());         
            }
        
            return attributes;
        
          }
        
          return null;
        
        } // GetAttributes   
        
        public static Expected GetAttributes<T, Expected>(this Enum value, Func<List<T>, Expected> expression) where T : Attribute {
        
          List<T> attributes = value.GetAttributes<T>();
        
          if (attributes == null)
            return default(Expected);
        
          return expression(attributes);
        
        } // GetAttributes 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-24
          • 1970-01-01
          • 2015-12-30
          • 2012-10-15
          • 1970-01-01
          相关资源
          最近更新 更多