消除用于拉取特定对象的多个 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
将是 key
,TimeSpan?
将是 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
}
型号:
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
将是 key
,TimeSpan?
将是 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
}