我想创建一个类似于对象的枚举,但还有一个额外的“属性”。
例如,我可以有一周中的一天枚举:
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而不是使用辅助类的枚举,但这对于我需要的东西来说似乎很复杂和重量级。
去哪里最好的方法是什么?
答案 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