2

我有一个带有子类的父类访问InpatientVisitClinicVisit等等。 最终我想创建一个访问列表,其中类型可以是父类或任何子类。到目前为止,我可以这样做:

Type visitType = null;
        Visit visit = new Visit();
        switch (typeOfVisit)
        {
            case VisitType.All:
                visit = new Visit();
                break;
            case VisitType.Inpatient:
                visit = new InpatientVisit();
                break;
            case VisitType.Clinic:
                visit = new ClinicVisit();
                break;
            case VisitType.Emergency:
                visit = new EmergencyVisit();
                break;
            case VisitType.DaySurgery:
                visit = new DaySurgeryVisit();
                break;
            default:
                break;
        }

        visitType = visit.GetType();

这是我卡住的地方。最终我想做这样的事情:

for (int rowCounter = 0; rowCounter < data.Rows.Count; rowCounter++)
        {
            Visit thisVisit = new Visit(data, rowCounter);
            this.Add(thisVisit);
        }

我需要替换 `Visit thisVisit = new Visit(data, rowCounter);

当前或将存在适当的构造函数。

4

3 回答 3

2

创建一个他们都实现的接口:

public interface IVisit
{
    // put any common function signatures here 
}

您的列表可以输入为 a List<IVisit>,此时存储哪种访问类型并不重要。然后你可以创建一个工厂方法,它的职责是知道返回哪种类型的IVisit

public static IVisit GetVisitInstance(VisitType typeToCreate)
{
     switch(typeToCreate)
     {
        case VisitType.All:
           return new Visit();

        case VisitType.Inpatient:
            return new InpatientVisit();

        case VisitType.Clinic:
            return new ClinicVisit();

        case VisitType.Emergency:
            return new EmergencyVisit();

        case VisitType.DaySurgery:
            return new DaySurgeryVisit();

        default:
            return null;
     }
} 

这不是最具可扩展性的解决方案,如果您四处搜索,您会发现执行此操作的更好(重新:可扩展)工厂实现。但是鉴于您已经拥有的东西,这应该是一种相当简单的方法。

于 2012-11-29T18:19:24.860 回答
1

如果你想创建一个 type 的类Visit,并在这个类中插入 classes: 的对象Visit, InpatientVisit, linicVisit, EmergencyVisit,那么最好的方法是使用所@Joel Etherton指出的接口。
但是您可以创建父类列表,然后将派生类添加到列表中。
假设您具有以下结构:

 class Visit
    {
        public string VisitName { get; set; }
    }
    class ImpatientVisit : Visit
    {
        public int ImpatientProperty { get; set; }
    }

然后你可以像这样创建访问列表:

            List<Visit> listOfVisits = new List<Visit>();

            var regularVisit = new Visit();
            regularVisit.VisitName = "regular";

            var impatientVisit = new ImpatientVisit();
            impatientVisit.VisitName = "impatient";
            impatientVisit.ImpatientProperty = 3;

            listOfVisits.Add(regularVisit);
            listOfVisits.Add(impatientVisit);

然后你可以像这样遍历列表:

            foreach (var visit in listOfVisits)
            {
                Console.WriteLine(visit.VisitName);
            }

这将打印出来

regular
patient

但是你不能在ImpatientVisit没有强制转换的情况下访问属性。
所以你可以做这样的事情:

            foreach (var visit in listOfVisits)
            {
                var impVisit = visit as ImpatientVisit;
                if (impVisit != null)
                {
                    Console.WriteLine(impVisit.ImpatientProperty + " "+ impVisit.VisitName);
                }
                else
                {
                    Console.WriteLine(visit.VisitName);
                }
            }  

这将打印出来

regular
3 impatient
于 2012-11-29T18:26:03.170 回答
0

使用 Activator 类,您可以创建一个工厂方法来执行此操作:

public static T CreateVisit<T>(DataSet ds, int row) where T : IVisit, new()
{
    return (T)Activator.CreateInstance(typeof(T), new object[] { ds, row });
}

注意:所有类都需要实现一个接口,IVisit

然后将从您的代码中调用它,如下所示:

InpatientVisit inpatientVisit = CreateVisit<Inpatient>(data, row);
于 2012-11-29T18:57:29.450 回答