簡體   English   中英

如何使用多個屬性創建ac#枚舉

[英]How to create a c# enumeration with more than one property

我想創建一個像對象一樣的枚舉,但帶有一個額外的“屬性”。

例如,我可以進行一周中的某天的枚舉:

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代替枚舉輔助類的枚舉,但是對於我需要的東西來說,這似乎很復雜且很繁重。

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

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();

您可以做的是向枚舉值添加自定義屬性,如下所示:

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;
}

也許像這樣:

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有效。

您可以將密封類與預定義的靜態實例一起使用。 額外的一個或多個屬性可以作為屬性或通過隱式轉換讀取。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM