Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果使用继承,如何检查列表的类型_C#_Winforms - Fatal编程技术网

C# 如果使用继承,如何检查列表的类型

C# 如果使用继承,如何检查列表的类型,c#,winforms,C#,Winforms,我目前正在开发一个C#程序,该程序创建一个对象任务列表,对象任务是一个基类,其他许多任务都继承自它。我想要的是比较所述列表中某个对象的类型,以查看应该打开哪个表单来编辑它 这是我已经创建的代码 private void itemEdit_Click(object sender, EventArgs e) { int edi = taskNameBox.SelectedIndex; Task checkTask = todoList.ElementAt(ed

我目前正在开发一个C#程序,该程序创建一个对象任务列表,对象任务是一个基类,其他许多任务都继承自它。我想要的是比较所述列表中某个对象的类型,以查看应该打开哪个表单来编辑它

这是我已经创建的代码

private void itemEdit_Click(object sender, EventArgs e)
    {
        int edi = taskNameBox.SelectedIndex;
        Task checkTask = todoList.ElementAt(edi);

        if(checkTask.GetType is Note)
        {
            noteBuilder editNote = new noteBuilder(todoList);
            editNote.Show();
        }

        else if(checkTask.GetType is extendedTask)
        {
            extendedTaskBuilder editTask = new extendedTaskBuilder(todoList);
            editTask.Show();
        }

        else if(checkTask.GetType is Reminder)
        {
            reminderBuilder editReminder = new reminderBuilder(todoList);
            editReminder.Show();
        }

        else if (checkTask.GetType is Appointment)
        {
            appointmentBuilder editAppointment = new appointmentBuilder(todoList);
            editAppointment.Show();
        }
    }
另一方面,如果不是在表单之间传递列表并生成表单的新对象来显示信息,而是在表单之间传递单个对象,并在每次向列表中添加新元素时更新表单,那么会更容易


非常感谢

您是否尝试过这样检查:

if (checkTask is Note)
{

}
...

您是否尝试过这样检查:

if (checkTask is Note)
{

}
...

您是否考虑过为您现在正在切换的所有类型创建一个基类并调用一个虚拟(抽象)方法

现在将所有代码放在重写的抽象方法的if中

优点: -开关的智能在其所属的类中。
-当添加一个新类型时,会出现一个编译器错误,将此功能也添加到新类型。

您是否考虑过为现在正在切换的所有类型创建一个基类并调用一个虚拟(抽象)方法

现在将所有代码放在重写的抽象方法的if中

优点: -开关的智能在其所属的类中。
-当添加一个新类型时,您会遇到一个编译器错误,将此功能添加到新类型。

我建议您使用继承来实现所需的功能,而不是执行一系列“if”子句。首先,在基类中创建一个虚拟方法。虚拟方法意味着它在基类中没有任何实现,只有声明:

public class Task
{
    (...)
    public virtual void ShowEditForm(IList todoList);
    (...)
}
然后创建子类方法(我假设todoList对象是IList,但如果不是IList,就更改它)

我没有写所有的课程,但我认为你已经有了这个想法。要调用该方法,只需从Task类调用该方法,就会执行正确的方法:

int edi = taskNameBox.SelectedIndex;
Task checkTask = todoList.ElementAt(edi);
checkTask.ShowEditForm(todoList);
这样,当您想要创建新类型的任务时,您只需使用适当的方法创建子类,继承系统将完成其余工作


还有一件事,子方法声明中的override关键字很重要,因为它告诉编译器,即使从基类调用该方法,也应该调用该方法。

我建议使用继承来实现您需要的,而不是执行那一系列的“if”子句。首先,在基类中创建一个虚拟方法。虚拟方法意味着它在基类中没有任何实现,只有声明:

public class Task
{
    (...)
    public virtual void ShowEditForm(IList todoList);
    (...)
}
然后创建子类方法(我假设todoList对象是IList,但如果不是IList,就更改它)

我没有写所有的课程,但我认为你已经有了这个想法。要调用该方法,只需从Task类调用该方法,就会执行正确的方法:

int edi = taskNameBox.SelectedIndex;
Task checkTask = todoList.ElementAt(edi);
checkTask.ShowEditForm(todoList);
这样,当您想要创建新类型的任务时,您只需使用适当的方法创建子类,继承系统将完成其余工作


还有一件事,子方法声明中的override关键字很重要,因为它告诉编译器,即使从基类调用该方法,也应该调用该方法。

首先,请注意第二点。您所说的是拥有一个全局对象,所有形式都在某个父对象中引用。这是可行的,但是您需要确保有某种机制,确保在表单发生更改时所有表单都是同步的,这可能会变得混乱,需要维护。我并不一定反对它,但只是在考虑时加上几句谨慎的话:)


至于您发布的代码,最好将其转化为一种方法,其中所有表单都继承自具有
Show
方法的基类/接口。然后您只需调用
checkTask.Show(todoList)。如果您不希望来自
任务
,那么您可以让您的表单都继承自上述基础,您可以使用一个函数,它接受
任务
列表
,并返回相应的表单,您只需调用
表单.Show()

首先,请注意第二点。您所说的是拥有一个全局对象,所有形式都在某个父对象中引用。这是可行的,但是您需要确保有某种机制,确保在表单发生更改时所有表单都是同步的,这可能会变得混乱,需要维护。我并不一定反对它,但只是在考虑时加上几句谨慎的话:)


至于您发布的代码,最好将其转化为一种方法,其中所有表单都继承自具有
Show
方法的基类/接口。然后您只需调用
checkTask.Show(todoList)。如果您不希望来自
任务
,那么您可以让您的表单都继承自上述基础,您可以使用一个函数,它接受
任务
列表
,并返回相应的表单,您只需调用
表单.Show()

这样的代码很难维护,您最好将其抽象出来,就像这样(假设.net中不包含
任务
):

或者,您可以使用注入模式:

public abstract class Task
{
    protected Task(Func<TaskList, IBuilder> builderStrategy)
    {
        _builderStrategy = builderStrategy;
    }

    public IBuilder GetBuilder(TaskList todoList))
    {
        return _builderStrategy(todolist);
    }
}

public class Note : Task
{
    public Note(Func<TaskList, IBuilder> builderStrategy) : base(builderStrategy) {}
}

// ...
note = new Note(x => return new noteBuilder(x));
公共抽象类任务
{
受保护任务(Func builderStrategy)
{
_builderStrategy=builderStrategy;
}
公共IBuilder GetBuilder(任务列表到列表))
{
返回构建者策略(todolist);
}
}
公共类注释:任务
{
公共注释(Func builderStrategy):基本(builderStrategy){}
}
// ...
note=新注释(x=>返回新的noteBuilder(x));
类似代码