有没有办法根据字符串确定对象的类型,然后创建该对象的新实例?
我目前正在做这样的事情:
switch (type_str){
case "Square":
Square S = new Square();
S.DoSomethingSquarey();
DoSomething(S);
break;
case "Circle":
Circle C = new Circle();
C.DoSomethingCircley();
DoSomething(C);
break;
case "Triangle":
Triangle T = new Triangle();
T.DoSomethingTriangley();
DoSomething(T);
break;
}
所有类型都将继承自基类“Shape”:
public static void DoSomething(Shape S){
//Doing Stuff...
}
这将很快失控,因为我需要不断向case语句添加形状。如果可能的话,我想做这样的事情:
Type ShapeType = Type.GetType("Square");
ShapeType X = new ShapeType();
DoSomething(X);
这会在编译时导致问题。有没有其他方法来简化这种案例陈述?
提前谢谢。
答案 0 :(得分:0)
您可以扫描当前程序集(或包含形状的任何程序集)以继承Shape
的类型,并使用Activator.CreateInstance
创建实例。如果你在字典中缓存名称和类型会更好,这样你就可以快速查找你想要的类型。
var type_str = "Circle";
// TypeChache should be static field
if (TypeChache == null)
{
var assem = Assembly.GetExecutingAssembly();
TypeChache = assem.GetTypes()
.Where(x => typeof(Shape).IsAssignableFrom(x))
.ToDictionary(x=>x.Name, x=>x);
}
var type = TypeChache[type_str];
var inst = (Shape) Activator.CreateInstance(type);
DoSomething(inst);