这是之前question的后续内容。这个问题出了问题(我实际上发布了我当前的解决方案,而不是我正在寻找的更好的解决方案)。
我有3个课程,ParentClass
,ClassA
,ClassB
。 ClassA
和ClassB
都是ParentClass
的子类。我想尝试使用某种枚举来创建ClassA
或ClassB
类型的对象来标识类型,然后将对象强制转换为父类型。我怎么能动态地做到这一点?请查看下面的代码以及//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
{
//.......
}
答案 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;
}