Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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#_.net_Generics - Fatal编程技术网

C# 合并泛型

C# 合并泛型,c#,.net,generics,C#,.net,Generics,我在C.net中开发,我相信我需要使用泛型来解决我的问题,但是我不知道从哪里开始 以下是我需要执行的步骤: 从用户处获取ID–完成 使用ID查询数据库表-完成 向后拉一排-完成 根据ID创建对象类型 根据类型填充对象 不同的约会需要从数据库中提取和填充不同的信息。例如,一个约会可能只需要用户的名字/姓氏,而另一个约会可能需要名字/姓氏/dob 我希望先执行子类,然后调用父方法。问题是myAppointment在通过Switch语句后仍被视为约会对象,而不是DoctorAppointment/Ot

我在C.net中开发,我相信我需要使用泛型来解决我的问题,但是我不知道从哪里开始

以下是我需要执行的步骤:

从用户处获取ID–完成 使用ID查询数据库表-完成 向后拉一排-完成 根据ID创建对象类型 根据类型填充对象 不同的约会需要从数据库中提取和填充不同的信息。例如,一个约会可能只需要用户的名字/姓氏,而另一个约会可能需要名字/姓氏/dob


我希望先执行子类,然后调用父方法。问题是myAppointment在通过Switch语句后仍被视为约会对象,而不是DoctorAppointment/OtherAppointment。我的约会是在什么地方声明的我实际上不知道它将是什么类型的对象

以下是我目前拥有的代码:

        tblAppointment getAppointment = (from getApp in dc.tblAppointments
                                         where getApp.appID == Id
                                         select getApp).SingleOrDefault();

// Needs to be set the something. I really want this be to set to a generic type as I don’t really know what type it will be until it has been through the switch statement
Appointment myAppointment = null; 

            switch (getAppointment.tblAppointment.appTypeID)
            {
                case 2:
                    {
// Changes myAppointment from Appointment to DoctorsAppointment
                        myAppointment = new DoctorsAppointment();

                    }
                    break;
                case 1:
                    {
                        myAppointment = new OtherAppointment();
                    }
                    break;
                default:

                    break;

            }

// I want this to set myAppointment to DoctorsAppointment.Populate(getAppointment)
            return myAppointment.Populate(getAppointment);
预约是家长课。 DoctorAppointment/OtherAppointment是子类

子类中的填充需要一个参数,而父类不需要。我当前收到的错误是:

No overload for method 'Populate' takes '1' arguments
希望我已经解释够了

谢谢


Clare

一个解决方案是,在父类预约中,使用如下方法:

public virtual void Populate( getAppointment) 
{
   // does nothing
}
然后在儿童班:

public override void Populate( getAppointment) 
{
// do what you need
}

听起来像是继承的例子

abstract class Appointment
{
    public abstract void Populate(AppointmentData data);
}

class DoctorsAppointment : Appointment
{
    public override void Populate(AppointmentData data)
    {
        // implementation specific to DoctorsAppointment
    }
}
class OtherAppointment : Appointment
{
    public override void Populate(AppointmentData data)
    {
        // implementation specific to OtherAppointment
    }
}

您应该将Appointment的Populate方法更改为抽象的(可能是虚拟的),并采用getAppointment的任何类型。DoctorAppointment和OtherAppointment子类通过覆盖Appointment的默认值来实现populate

abstract class Appointment 
{
    public abstract string Populate(AppointmentData d);
}

class OtherAppointment : Appointment
{
    public override string Populate(AppointmentData d)
    {

    }
}
将约会设置为抽象类它不能自己实例化,也不能将填充方法设置为抽象,因此它必须由它的继承类实现

约会类应声明适当的填充方法。您还可以设置约会工厂类:

static class AppointmentFactory
{
    public static Appointment Create(int type) 
    {
        switch (type)
        {
            case 2:
                return new DoctorsAppointment();
            case 1:
                return new OtherAppointment();
            default:
                throw new AppointmentTypeNotSupportedException();
        }
    }
}

class Appointment
{
    public virtual void Populate(getAppointment data) { }
}

class DoctorsAppointment : Appointment
{
    public override void Populate(getAppointment data) {  }
}

class OtherAppointment : Appointment
{
    public override void Populate(getAppointment data) {  }
}

建议您选择上面的一个继承答案

我认为有必要问一下您是否正在使用LINQ to SQL?如果您有一个存储不同类型对象的表,那么您所需的功能将部分实现


有关示例,请参见

Is约会。是否填充虚拟方法?另外,当appTypeID不是1或2时,这里有一个NullReferenceException…我想你的意思是“抽象的”,而不是“虚拟的”…因为虚拟方法必须有一个主体,因此上面的代码不会编译,调试前键入的,现在应该修复。我希望先执行子类,然后调用父方法。问题是myAppointment在通过Switch语句后仍被视为约会对象,而不是DoctorAppointment/OtherAppointment。myAppointment声明的位置我实际上不知道它将是什么类型的对象。getAppointment是否缺少它的类型?还是我误读了你的代码?getAppointment是通过LINQ对象设置的。tblAppointment getAppointment=来自dc.tblappoints中的getApp,其中getApp.appID==Id选择getApp.SingleOrDefault;我正在使用LINQtoSQL,但我不确定Guy Burstein是如何实现它的。我需要使用XML基映射吗?文章中显示的类图,是否在dbml中?是的。简单地说,您通常会添加DBML文件。然后将对象从服务器资源管理器拖放到其中。这将生成类。在您的情况下,如果有一个映射到继承层次结构的数据库表,则需要手动进行一些调整,以向DBML显示层次结构的工作方式