我有以下代码,我目前正在使用....基本上,此方法为每个任务分配正确的布尔标志(TRUE / FALSE)。随着越来越多的任务需要添加..我可以看到switch语句必须增长以满足每个任务。
必须有一种更简单的方法......保持方法的小。
代码:(忘记命名约定,已发布更改)
public ClassStructure.User AssignTaskStatusToUser(ClassStructure.User,
List<ClassStructure.Tasks> TaskStatus)
{
foreach (ClassStructure.Tasks data in TaskStatus)
{
string Task_CallID = data.Task_Call_ID;
switch (Task_CallID)
{
case ClassStructure.Tasks_CallIDs_Strings.TASK1:
User.TASK1 = data.Task_Flag;
break;
case ClassStructure.Tasks_CallIDs_Strings.TASK2:
User.TASK2 = data.Task_Flag;
break;
case ClassStructure.Tasks_CallIDs_Strings.TASK3:
User.TASK3 = data.Task_Flag;
break;
}
}
return User;
}
ClassStructure.Tasks_CallIDs_Strings =字符串表示任务
data.Task_Flag = boolean
User.TASKX = boolean
欢迎任何反馈。我相信有一个简单的解决方案。
答案 0 :(得分:9)
对于很多像这样的值,我会使用这样的地图:
Dictionary<ClassStructure.Tasks_CallIDs_Strings, Task_Flag>
并通过映射CallIDs字符串来检索值。
编辑:
正如大家现在所看到的,重构这个例子的真正问题在于重构User.TASKX。将它列为一个列表就足够了 - 因为它可以用相同的字符串索引 ClassStructure.Tasks_CallIDs_Strings
答案 1 :(得分:2)
哦......重新考虑你的命名方案。
public delegate void TaskAssigner(User user, bool taskFlag)
IDictionary<string, TaskAssigner> taskAssigners = new Dictionary<string, TaskAssigner>();
...
taskAssigners.Add(ClassStructure.Tasks_CallIDs_Strings.TASK1, (u, t) => u.TASK1 = t;);
taskAssigners.Add(ClassStructure.Tasks_CallIDs_Strings.TASK2, (u, t) => u.TASK2 = t;);
...
foreach(ClassStructure.Tasks data in TaskStatus)
taskAssigners[data.Task_Call_ID](user, data.Task_Flag);
答案 2 :(得分:2)
我在想这样的事情 - 但也许我错过了它的全部意义?
public class User
{
private Dictionary<string,Task> tasks;
internal Dictionary<string,Task> Tasks
{
get { return tasks; }
set { tasks = value; }
}
internal void AddTask(Task task)
{
tasks.Add(task.Task_Call_ID,task);
}
internal void AddTasks(List<Task> task)
{
foreach(Task task in Tasks)
{
tasks.Add(task.Task_Call_ID,task);
}
}
}
如果你需要这种灵活性,Task类可以拥有允许你传递函数指针(实际执行任务的函数)的属性 - 你也可以向User添加其他方法,如ExecuteTasks ......
答案 3 :(得分:1)
您是否可以使用数组/任务列表并使用Task_CallID作为索引?
e.g。
User.Tasks[Task_CallID] = data.Task_Flag;
如果你必须将它们全部作为成员,还有其他选择:
这两个都是基于反思的,有点讨厌。
答案 4 :(得分:1)
为什么不将用户任务结构化为列表:
用户类
public List<ClassStructure.Tasks> Tasks {
get; set;
}
您的方法变为:
public void AssignTasks(User user, List<ClassStructure.Tasks> TaskStatus)
{
user.Tasks.AddRange(TaskStatus)
}
这就是说你根本不需要这个方法。 然后,您的访问者将在用户的任务上运行查找并检查“任务”标记。
答案 5 :(得分:1)
字典是一个很好的选择。但是,当交换机/案例变得非常复杂时,请考虑使用策略模式(不过您的场景)。