好吧,也许您应该使用 Dictionary<DayOfWeek, TimeSpan?> 而不是多个属性。
如果不可能:
高效的方式,switch:
public class Deadlines
{
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; }
public TimeSpan? GetDeadLine(DayOfWeek dow)
{
switch(dow)
{
case DayOfWeek.Monday:
return Monday;
case DayOfWeek.Tuesday:
return Tuesday;
case DayOfWeek.Wednesday:
return Wednesday;
case DayOfWeek.Thursday:
return Thursday;
case DayOfWeek.Friday:
return Friday;
case DayOfWeek.Saturday:
return Saturday;
case DayOfWeek.Sunday:
return Sunday;
default: throw new ArgumentException(nameof(dow));
}
}
}
或者你可以有一个返回截止日期的字典:
public class Deadlines
{
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; }
private static readonly Dictionary<DayOfWeek, Func<Deadlines, System.TimeSpan?>> DayOfWeekMapper;
static Deadlines()
{
DayOfWeekMapper = new Dictionary<System.DayOfWeek, Func<Deadlines, System.TimeSpan?>>
{
{ DayOfWeek.Monday, dl => dl.Monday },{ DayOfWeek.Tuesday, dl => dl.Tuesday },{ DayOfWeek.Wednesday, dl => dl.Wednesday },
{ DayOfWeek.Thursday, dl => dl.Thursday },{ DayOfWeek.Friday, dl => dl.Friday },{ DayOfWeek.Saturday, dl => dl.Saturday },{ DayOfWeek.Sunday, dl => dl.Sunday }
};
}
public TimeSpan? GetDeadline(DayOfWeek dow) => DayOfWeekMapper[dow].Invoke(this);
}
还有反射,但我不会在这里使用它,因为它效率不高且不可读。
嗯,就是这样:
public class Deadlines
{
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; }
private static readonly Dictionary<string,PropertyInfo> DayOfWeekPropertyMapper;
static Deadlines()
{
DayOfWeekPropertyMapper = typeof(Deadlines).GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => Enum.GetNames(typeof(DayOfWeek)).Contains(p.Name))
.ToDictionary(p => p.Name, p => p);
}
public TimeSpan? GetDeadline(string dayOfWeek) => (TimeSpan?)DayOfWeekPropertyMapper[dayOfWeek].GetValue(this);
}
使用您的样品:
string dow = DateTime.Now.DayOfWeek.ToString();
IEnumerable<TimeSpan?> deadlines = _api.Select(x => x.Deadlines.GetDeadline(dow));