根据字符串确定对象的类型并创建新实例?

时间:2017-01-12 17:36:38

标签: c#

有没有办法根据字符串确定对象的类型,然后创建该对象的新实例?

我目前正在做这样的事情:

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

这会在编译时导致问题。有没有其他方法来简化这种案例陈述?
提前谢谢。

1 个答案:

答案 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);