4

我有以下我目前正在使用的代码....基本上,此方法为每个任务分配正确的布尔标志 (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 = 布尔值

User.TASKX = 布尔值

欢迎任何反馈。我确信有一个简单的解决方案。

4

6 回答 6

9

对于很多像这样的值,我会使用这样的地图:

Dictionary<ClassStructure.Tasks_CallIDs_Strings, Task_Flag>

并通过映射 CallIDs 字符串来检索值。

编辑:

现在大家可以看到,重构这个例子的真正问题在于重构User.TASKX。让它成为一个列表就足够了——因为它可以被相同的字符串ClassStructure.Tasks_CallIDs_Strings索引

于 2009-02-18T15:02:39.620 回答
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);
于 2009-02-18T15:04:42.393 回答
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 类可以具有允许您传递函数指针(到实际执行任务的函数)的属性 - 您也可以将其他方法(如 ExecuteTasks)添加到 User ......

于 2009-02-18T16:01:39.090 回答
1

你能有一个任务数组/列表,并使用 Task_CallID 作为索引吗?

例如

User.Tasks[Task_CallID] = data.Task_Flag;

如果您必须将它们全部作为成员,还有其他选择:

  1. 维护从 Task_Call_ID 到 PropertyInfo 引用的映射,并使用它来设置正确的属性
  2. 使用反射根据数字位 (X) 查找属性并设置该属性

这两个都是基于反射的,有点讨厌。

于 2009-02-18T15:01:30.480 回答
1

为什么不将用户任务结构化为列表:

用户类

public List<ClassStructure.Tasks> Tasks {
    get; set;
}

您的方法变为:

public void AssignTasks(User user, List<ClassStructure.Tasks> TaskStatus)    
{
    user.Tasks.AddRange(TaskStatus)   
}

也就是说你根本不需要这个方法。然后,您的访问器将在用户的任务上运行查找并检查任务标志。

于 2009-02-18T15:35:12.663 回答
0

字典是一个很好的选择。但是,当一个开关/案例变得非常复杂时,使用策略模式(虽然不适用于您的场景)。

于 2011-11-29T17:08:04.857 回答