如何将枚举传递给父类的静态函数来实例化子类第二部分?

时间:2013-02-20 23:11:12

标签: c#

这是之前question的后续内容。这个问题出了问题(我实际上发布了我当前的解决方案,而不是我正在寻找的更好的解决方案)。

我有3个课程,ParentClassClassAClassBClassAClassB都是ParentClass的子类。我想尝试使用某种枚举来创建ClassAClassB类型的对象来标识类型,然后将对象强制转换为父类型。我怎么能动态地做到这一点?请查看下面的代码以及//what do I put here?部分。谢谢你的阅读!

public enum ClassType     {         ClassA的,         ClassB的     };

public abstract class ParentClass
{
    public static readonly Dictionary<ClassType, Type> Types = 
        new Dictionary<ClassType, Type>{
            {ClassType.ClassA, typeof(ClassA) },
            {ClassType.ClassB, typeof(ClassB) }
        };

    public ParentClass()
    {
        //....
    }

    public static ParentClass GetNewObjectOfType(ClassType type)
    {
        //What do I put here?
    }
}

public class ClassA:ParentClass
{
    //....
}
public class ClassB:ParentClass
{
    //.......
}

3 个答案:

答案 0 :(得分:2)

您可以使用Activator类轻松完成,特别是如果构造函数没有任何参数:

return Activator.CreateInstance(Types[type]);

答案 1 :(得分:2)

重述您的问题:您正在寻找有关如何编写静态工厂方法的建议。

我认为您不需要单独的枚举来完成此任务。这是我汇集的LINQPad脚本(编辑:添加静态常量,使用它们创建演示)

void Main()
{
    var a = ParentClass.Create(typeof(ClassA));
    var b = ParentClass.Create(typeof(ClassB));
    var c = ParentClass.Create(ParentClass.ClassAType);
    a.Dump();
    b.Dump();
    c.Dump();
}


public abstract class ParentClass
{
    public static readonly Type ClassAType = typeof(ClassA); 
    public static readonly Type ClassBType = typeof(ClassB);
    public string SomeProp { get; set; }
    protected ParentClass() {}

    public static ParentClass Create(Type typeToCreate)
    {
        // validate that type is derived from ParentClass
        return (ParentClass)Activator.CreateInstance(typeToCreate);
    }
}

public class ClassA:ParentClass {
    public ClassA()
    {
        SomeProp = "ClassA~";
    }

}
public class ClassB:ParentClass
{
    public ClassB()
    {
        SomeProp = "ClassB~";
    }
}

答案 2 :(得分:1)

如前一个问题所述:

  

反射很慢,经常在不需要的地方使用

Activator.CreateInstance使用反射来追踪无参数构造函数。要解决这个问题 - 这是不需要的。父类已经知道它负责创建的所有类型。


使用静态工厂方法的一个原因是,创建子类可能涉及大量工作或涉及不同类型的工作。我想如果你加强你的地图,你可以更容易地编写静态工厂:

public static readonly Dictionary<ClassType, Func<ParentClass>> Types = 
    new Dictionary<ClassType, Func<ParentClass>>{
        {ClassType.ClassA, () => new ClassA(1, 2, 3) },
        {ClassType.ClassB, () => new ClassB("1") }
    };


public static ParentClass GetNewObjectOfType(ClassType type)
{
    Func<ParentClass> maker = Types[type];
    ParentClass result = maker();
    return result;
}