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

C# 消除用于提取特定对象属性的多个If语句,c#,object-property,C#,Object Property,我有下面的解决方案(删除一些无关的代码以便于阅读),它迭代对象列表并根据条件(在这个场景中,是哪一天)提取特定属性 这是可行的,但还有比这更优雅的解决方案吗 foreach (var object in objectList) { var time = new TimeSpan?(); if (today.DayOfWeek == DayOfWeek.Monday) time = object.Monday; else if (today.DayOfWe

我有下面的解决方案(删除一些无关的代码以便于阅读),它迭代对象列表并根据条件(在这个场景中,是哪一天)提取特定属性

这是可行的,但还有比这更优雅的解决方案吗

foreach (var object in objectList)
{
    var time = new TimeSpan?();

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

    SaveTime(object.Id, time);
}

可能是这样的(但没有编译此代码)


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

如果您能够修改构成
objectList
变量的
对象的类,那么请尝试在该类中使用
字典
DayOfWeek
将是
TimeSpan?
将是
。这将简化类并消除长
if-else
逻辑

另外,如果我没有弄错的话,这种方法也会比使用反射更快,并且不会依赖于
对象的属性名
拼写与
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
}
static void Main(字符串[]args)
{
List weekObjs=新列表();
foreach(在weekObjs中的var obj)
{
保存时间(obj.ID,obj.weekDictionary[DateTime.Today.DayOfWeek]);
}
}
类WeekObject
{
公共int ID{get;set;}
公共字典weekDictionary{get;set;}=new Dictionary();
公共周末对象()
{
//如果愿意,请在此处初始化字典
weekDictionary.Add(DayOfWeek.Sunday,null);
}
}
公共静态void保存时间(int-ID,TimeSpan?TimeSpan)
{
//你的代码在这里
}

代码没有太多意义。您有一个名为
object
的变量?我对此深表怀疑。本守则的用意是什么?感觉像是一个,这听起来像是一个,这将使它脱离本网站的主题。或者,您可以使用switch case或创建一个字典,其中键是DayOfWeek的值,值是“object”的值。您可以将它们放在一个数组中,然后将
DayOfWeek
枚举强制转换为
int
以从该数组中进行选择,但这样做不会更好,而且需要在堆上进行另一次分配。如果您要调用对象“object”,它必须是
@object
,但永远不要这样做:)反射似乎是一个坏方法在这里,我们应该从OP中找出更多细节
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
}