从枚举中存储和读取附加信息的有效方法是什么?



我试图从枚举中存储和检索额外的信息。最后我用了两种方法。第一种方法是使用自定义属性。https://stackoverflow.com/a/22054994/5078531https://stackoverflow.com/a/35040378/5078531

public class DayAttribute : Attribute
{
    public string Name { get; private set; }
    public DayAttribute(string name)
    {
        this.Name = name;
    }
}
enum Days
{
    [Day("Saturday")]
    Sat,
    [Day("Sunday")]
    Sun
}
public static TAttribute GetAttribute<TAttribute>(this Enum value)
        where TAttribute : Attribute
    {
        var enumType = value.GetType();
        var name = Enum.GetName(enumType, value);
        return enumType.GetField(name).GetCustomAttributes(false).OfType<TAttribute>().SingleOrDefault();
    }

我在这里找到的第二个方法,通过在枚举上编写一个扩展方法。https://stackoverflow.com/a/680515/5078531

public enum ArrowDirection
{
    North,
    South,
    East,
    West
}
public static class ArrowDirectionExtensions
{
     public static UnitVector UnitVector(this ArrowDirection self)
     {         
         switch(self)
         {
             case ArrowDirection.North:
                 return new UnitVector(0, 1);
             case ArrowDirection.South:
                 return new UnitVector(0, -1);
             case ArrowDirection.East:
                 return new UnitVector(1, 0);
             case ArrowDirection.West:
                 return new UnitVector(-1, 0);
             default:
                 return null;
         }
     }
}

如果我正在寻找性能,我应该选择哪种方法?还是有其他有效的方法,我错过了?

都是有效的实现方式;就像许多其他方式一样。就我个人而言,我喜欢第一种方式的便利。反射的性能损失可以通过只处理一次属性来减轻,并存储(假设在static字段中)-如果枚举值是连续的并且基于0,则可能作为平面数组;否则,可能在字典中。

如果您愿意,您可以使DayaAttributeCache更通用,以便它可以存储其他enum和属性类型。我这么做只是为了展示一种缓存方法。枚举值必须从0开始连续,但如果需要,可以更改以处理这种情况。

public static class DaysAttributeCache
{
    private static readonly string[] Cache;
    static DaysAttributeCache()
    {
        Type enumType = typeof(Days);
        Cache = new string[Enum.GetValues(enumType).Length];
        foreach (Enum value in Enum.GetValues(enumType))
        {
          var name = Days.GetName(enumType, value);
          DayAttribute attribute = enumType
              .GetField(name)
              .GetCustomAttributes(false)
              .OfType<DayAttribute>()
              .SingleOrDefault();
          string weekDay = attribute?.Name;
          Cache[((IConvertible)value).ToInt32(CultureInfo.InvariantCulture)] = weekDay;
        }
    }
    public static string GetWeekday(this Days value)
    {
        return Cache[(int)value];
    }
  }

这样叫…

string saturday = Days.Sat.GetWeekday();

相关内容

  • 没有找到相关文章

最新更新