c# - 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
其用作基类并派生出一堆称为我想要的方便名称的类。我可能可以循环浏览对象列表并相当容易地查看它们的属性,同时还可以随时通过它们的名称调用每个实例。
解决方案
您可以只创建一个接受任务类的任务名称的构造函数。此外,您可以添加一个方法,将新任务添加到跟踪任务的类中的字典中。您可以创建第二种方法,从任务列表中添加到您的字典中。
添加了基于注释: 如果有特殊情况的任务,您可以添加常量,并且您担心输入错误的名称。
您还可以从 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);
推荐阅读
- neo4j - 如何访问路径集合中的节点对象?(两个或多个节点的路径)
- bash - 如何从文件中生成多个计数而无需多次重新读取?
- c++ - 是否可以将函数的名称传递给模板?
- php - 成功提交表单后将表单帖子重定向到 Laravel 5.8 中的外部 url 页面
- java - 使用 Logback 依赖项抑制 JSESSIONID cookie
- javascript - 从同一域加载文件时出现 CORS 错误
- javascript - 如何修复 Google Apps 脚本中的“TypeError:无法调用 null 的方法“getRange””
- javascript - 需要关于分配范围和回报的指导
- c# - 使用 DateTimeOffset 作为参数问题进行过滤
- python - 如何选择 XML 子标签并以 Python 方式使用自定义键填充字典列表