首页 > 解决方案 > c# 在添加到列表时创建新命名的实例

问题描述

我有一个这样的基础课:

public class task
    {
        public string tName;
        // Construct
        public job(string t)
        {
            tName = t;
        }
    }

目前我可以这样做:

public class TASKCLASS
    {

        private task myTaskName1 = new task("name of task 1");

        public Dictionary<string, task> tasks = new Dictionary<string, task>();

        // Construct
        public TASKCLASS()
        {
            tasks.Add(myTaskName1.tName, myTaskName1);
        }
    }

太好了,这样行得通!但是我有很多任务要添加到字典中 - 现在我知道我不能像这样tasks直接在.Add部分中添加我的:

public class TASKCLASS
    {

        public Dictionary<string, task> tasks = new Dictionary<string, task>();

        // Construct
        public TASKCLASS()
        {
            tasks.Add("name of task 1", myTaskName1 = new task("name of task 1"));
        }
    }

myTaskName1因为即使我试图.Add在行中创建该对象也不存在

但是我想知道是否有任何方法可以构建我的任务类,以便我可以使用创建一个新的tName并将它添加到我的字典中的同一行以防止 DRY 错误某处?

想法:我可以为我的工作字典创建一个新方法,以便该.Add函数将简单地获取对象tName的名称和名称吗?task

编辑:我想我可能只是将task其用作基类并派生出一堆称为我想要的方便名称的类。我可能可以循环浏览对象列表并相当容易地查看它们的属性,同时还可以随时通过它们的名称调用每个实例。

标签: c#

解决方案


您可以只创建一个接受任务类的任务名称的构造函数。此外,您可以添加一个方法,将新任务添加到跟踪任务的类中的字典中。您可以创建第二种方法,从任务列表中添加到您的字典中。

添加了基于注释: 如果有特殊情况的任务,您可以添加常量,并且您担心输入错误的名称。

您还可以从 Task 继承并创建具有保留名称的派生任务。但这意味着派生类将仅限于字典中的单个实例。我不确定这是否是你想要的。从基类继承来维护一个名字对我来说似乎有点矫枉过正。

public class Task
{
    //protected task name that can only be set in base or derived classes
    protected string name;

    //Property to return task name
    public string Name { get { return name; } }

    public Task() {

    }

    //Task contructor that requires a name value to be instantiated
    public Task(string name)
    {
        this.name = name;
    }
}

public class DerivedTask1 : Task
{
    public static const string TASK_NAME = "Derived Task Name 1";

    public DerivedTask1() 
    {
        this.name = TASK_NAME;
    }
}

public class TaskTracker
{ 
    //Private dictionary to hold tasks
    private Dictionary<string, Task> tasks;

    public TaskTracker()
    {
        this.tasks = new Dictionary<string, Task>();
    }

    public void AddTask(Task task) {
        //Adds a task to the dictionary, note that there is no error checking and will fail when task with duplicate name is added
        this.tasks.Add(task.Name, task);
    }

    public void AddTasks(List<Task> newTasks)
    {
        //Adds all tasks in a list to the backing task dictionary
        foreach(Task task in newTasks)
        {
            AddTask(task);
        }
    }

    public Task GetTask(string taskName)
    {
        if (this.tasks.ContainsKey(taskName))
        {
            return this.tasks[taskName];
        }
        else
        {
            return null;
        }
    }
}

将任务添加到您的集合的代码示例:

const string RESERVED_TASK_NAME_1 = "Reserved Task Name 1";
const string RESERVED_TASK_NAME_2 = "Reserved Task Name 2";

var tracker = new TaskTracker();
tracker.AddTask(new Task("Task 1"));
tracker.AddTask(new Task("Task 2"));

var taskList = new List<Task>();
taskList.Add(new Task(RESERVED_TASK_NAME_1));
taskList.Add(new Task(RESERVED_TASK_NAME_2));

tracker.AddTasks(taskList);

var taskFromLookup = tracker.GetTask(RESERVED_TASK_NAME_1);

tracker.AddTask(new DerivedTask1());
var otherTaskFromLookup = tracker.GetTask(DerivedTask1.TASK_NAME);

推荐阅读