[英]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.