2017-01-12 10 views
-1

文字列に基づいてオブジェクトの型を判定し、そのオブジェクトの新しいインスタンスを作成する方法はありますか?文字列に基づいてオブジェクトの型を決定し、新しいインスタンスを作成しますか?

私は現在、このような何かをしています:

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

すべての種類は、基本クラス「形」から継承します:

public static void DoSomething(Shape S){ 
    //Doing Stuff... 
} 

私が必要となりますので、これはすぐに維持するために、手に負えなくなりますcaseステートメントに形状を継続的に追加する。可能であれば、私は次のようなことをしたいと思います:

Type ShapeType = Type.GetType("Square"); 
ShapeType X = new ShapeType(); 
DoSomething(X); 

これはコンパイル時に問題を引き起こします。このケースステートメントを単純化する別の方法はありますか?
ありがとうございます。

+0

[Activator.CreateInstance](http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx)のように? – DavidG

+1

Reflectionもあります。これはここで答えられました:http://stackoverflow.com/questions/540066/calling-a-function-from-a-string-in-c-sharp – CDove

+1

文字列として要件を比較するのはなぜですか?一般的なコードで[magic strings](https://en.wikipedia.org/wiki/Magic_number_(プログラミング)#Unnamed_numerical_constants)を使用することはお勧めしません。文字列の代わりに[種類](https://msdn.microsoft.com/en-us/library/58918ffs.aspx)を使用すると、実行しようとしていることは何度も簡単になります。 –

答えて

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); 
関連する問題