如何使用多个属性创建c#枚举

时间:2016-12-16 09:23:31

标签: c# .net class enumeration

我想创建一个类似于对象的枚举,但还有一个额外的“属性”。

例如,我可以有一周中的一天枚举:

enum Day {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

现在,假设我每天都想要存储另一个属性。一些永不改变的东西。为了论证,我们假设我们的工资率从未改变,周六为1.5,周日为2,否则为1。

无法使用枚举执行此操作。我正在考虑创建一个“助手”静态类,它只会返回第二个属性,但这看起来很笨拙。

static class Rate
{
    static float GetRate(Day d)
    {
        switch (d)
        {
            case Day.Saturday:
                return 1.5f;
            case Day.Sunday:
                return 2f;
            default:
                return 1f;

        }
    }
}

我可以使用ReadOnlyCollection而不是使用辅助类的枚举,但这对于我需要的东西来说似乎很复杂和重量级。

去哪里最好的方法是什么?

4 个答案:

答案 0 :(得分:3)

C#枚举值是简单的单值,与其他语言不同,它们可以是复杂类型(例如元组)。

如果枚举值代表不可变数据的“关键字”,你可以通过使用带有switch块的扩展方法来破解它 - 类似于你的例子,但在使用时语法更清晰:

enum Day {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

public static class DayExtensions
{
    public static Single GetRate(this Day d)
    {
        switch( d )
        {
            case Day.Saturday:
                return 1.5f;
            case Day.Sunday:
                return 2f;
            default:
                return 1f;
        }
    }
}

用法:

Day d = Day.Monday;
Single rate = d.GetRate();

答案 1 :(得分:2)

您可以做的是将自定义属性添加到枚举值中,如下所示:

enum Day {
    [MyAttr(Rate=1.5f)]
    Sunday, 
    [MyAttr(Rate=2)]
    Monday
}

public class MyAttr : Attribute {
    public float Rate {get;set;}
}

然后读取这样的属性:

public float GetRate(Day day) {
    MemberInfo memberInfo = typeof(Day).GetMember(day.ToString()).FirstOrDefault();

    if (memberInfo != null) {
        MyAttr attribute = (MyAttr)memberInfo
            .GetCustomAttributes(typeof(MyAttr), false)
            .FirstOrDefault();
        return attribute.Rate;
    }

    return 0;
}

答案 2 :(得分:1)

也许是这样的:

public struct Day
{
    public Day(int key, float rate)
    {
        _key = key;
        _rate = rate;
    }
    private readonly int _key;
    private readonly float _rate;
    public int Key => _key;
    public float Rate => _rate;

    public static readonly Day
        Monday = new Day(0, 1f),
        Tuesday = new Day(0, 1f), ...;

    public static implicit operator int(Day day) => day.Key;
}

然后Day.Monday.Rate有效,int day = Day.Monday有效。

答案 3 :(得分:1)

您可以使用带有预定义静态实例的密封类。额外属性(或属性)可以作为属性读取,也可以通过隐式转换读取。

public sealed class Day
{
    private Day(float rate)
    {
        m_Rate = rate;
    }

    private readonly float m_Rate;
    public float Rate { get { return m_Rate; } }

    public static readonly Day Saturday = new Day(1.5f);
    public static readonly Day Sunday = new Day(2f);
    public static readonly Day Monday = new Day(1f);
    public static readonly Day Tuesday = new Day(1f);
    public static readonly Day Wednesday = new Day(1f);
    public static readonly Day Thursday = new Day(1f);
    public static readonly Day Friday = new Day(1f);

    public static implicit operator float(Day day)
    {
        return day.m_Rate;
    }
}

用法:

var day = Day.Sunday;
var rate = day.Rate;      // Use property
float rate2 = day;        // Use implicit conversion
相关问题