消除用于拉取特定对象的多个 If 语句 属性

Eliminating Multiple If Statements For Pulling A Specific Object Property

型号:

public class ServiceHours
{
    public int Id { get; set; }
    ...
    public TimeSpan? Monday { get; set; }
    public TimeSpan? Tuesday { get; set; }
    public TimeSpan? Wednesday { get; set; }
    public TimeSpan? Thursday { get; set; }
    public TimeSpan? Friday { get; set; }
    public TimeSpan? Saturday { get; set; }
    public TimeSpan? Sunday { get; set; }
}

我目前正在遍历“服务时间”对象列表(它们可以包含一周中 1 天或多天的可选开始时间)。我希望能够从 DateTime 对象中动态获取对应于 DayOfWeek 枚举的值。

这可行,但不是很优雅

var today = DateTime.Today.DayOfWeek;

foreach (var item in myItems)
{
    var time = new TimeSpan?();

    if (today == DayOfWeek.Monday)
        time = item.Monday;
    else if (today == DayOfWeek.Tuesday)
        time = item.Tuesday;
    else if (today == DayOfWeek.Wednesday)
        time = item.Wednesday;
    else if (today == DayOfWeek.Thursday)
        time = item.Thursday;
    else if (today == DayOfWeek.Friday)
        time = item.Friday;
    else if (today == DayOfWeek.Saturday)
        time = item.Saturday;
    else if (today == DayOfWeek.Sunday)
        time = item.Sunday;

    ...
}

更新: 当时我最终使用了反射,但这是一个非常糟糕、幼稚的设计,无论如何这个问题都应该发布到 Code Review——这个问题应该被忽略,只要添加这个通知以防其他人出现.感谢那些不顾可怕的问题而试图提供帮助的人!

可能是这样的(虽然没有编译这段代码)

object.GetType().GetProperty(today.DayOfWeek.ToSring()).GetValue(object)

使用反射获取 属性 值,唯一的条件是 DayOfWeek 枚举成员必须具有 属性 的 确切 名称在 object 类型中。

如果您能够修改构成 objectList 变量的 object 的 class,请尝试在 class 中使用 Dictionary<DayOfWeek, TimeSpan?> ]. DayOfWeek 将是 keyTimeSpan? 将是 value。这将简化 class 并消除长 if-else 逻辑。

此外,如果我没记错的话,这种方法也比使用反射更快,并且不会依赖 object 的 属性 名称拼写完全相同DayOfWeek 中的星期几(如果您将来出于某种原因需要重构)。

这是一个例子:

static void Main(string[] args)
{
    List<WeekObject> weekObjs = new List<WeekObject>();

    foreach (var obj in weekObjs)
    {
        SaveTime(obj.ID, obj.weekDictionary[DateTime.Today.DayOfWeek]);
    }
}

class WeekObject
{
    public int ID { get; set; }
    public Dictionary<DayOfWeek, TimeSpan?> weekDictionary { get; set; } = new Dictionary<DayOfWeek, TimeSpan?>();

    public WeekObject ()
    {
        // Initialize dictionary here if you'd like
        weekDictionary.Add(DayOfWeek.Sunday, null);
    }
}

public static void SaveTime(int ID, TimeSpan? timeSpan)
{
    // Your code here
}