当类是变量时创建变量

时间:2012-11-29 18:06:59

标签: c# asp.net .net

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

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);
        }

我需要替换`访问thisVisit =新访问(data,rowCounter);

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

3 个答案:

答案 0 :(得分:2)

创建一个他们都实现的界面:

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

您的列表可以输入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;
     }
} 

这不是最具扩展性的解决方案,如果您搜索一下,您会发现更好的(re:Scalable)工厂实现。但鉴于你已经拥有的东西,这应该是一个相当简单的方法。

答案 1 :(得分:1)

如果要创建类型Visit的类,并在类的类对象中插入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

答案 2 :(得分: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);