あなたはできないと言われてきましたが、それでもできます。
まず、コードを見てみましょう:
class Class1{ }
class Class2{ }
class Class3{ }
void Main()
{
Type t = /*some type unknown at compile-time*/;
object instance = Activator.CreateInstance(t);
}
そしてあなたの質問:
このオブジェクトを変数 t にある型にキャストするにはどうすればよいですか。
この情報だけを見ると、答えは次のとおりです。変数には無限のタイプのセットがあるためt
、実際には、このコードが書かれた後に定義されている可能性があります(それらはまだ存在していませんでした)。
ええと、そうであるように思われますが、他にもいくつかの情報があります。
変数 t は Class1 または Class2 または Class3
variable に含まれる可能性のある型の有限セットがあることを意味しますt
。
それを念頭に置いて、たとえば次のように確認できます。
class Class1{ }
class Class2{ }
class Class3{ }
void Main()
{
var possibleTypes = new Type[]
{
typeof(Class1),
typeof(Class2),
typeof(Class3)
};
Type t = possibleTypes[(new Random()).Next(possibleTypes.Length)];
object instance = Activator.CreateInstance(t);
if (t.Equals(typeof(Class1)))
{
DoSomethingWithClass1(instance as Class1);
}
else if (t.Equals(typeof(Class2)))
{
DoSomethingWithClass2(instance as Class2);
}
else if (t.Equals(typeof(Class3)))
{
DoSomethingWithClass3(instance as Class3);
}
}
void DoSomethingWithClass1(Class1 instance)
{
//...
}
void DoSomethingWithClass2(Class2 instance)
{
//...
}
void DoSomethingWithClass3(Class3 instance)
{
//...
}
それはうまく機能し、各クラスのメソッド内では、そのクラスに適したものは何でも使用できます。
「あまり一般的ではありません」-「新しいクラスが登場するたびに新しいメソッドを書きたくない!」とあなたは言います。そして、私は同意します、あなたはそれをリフレクションの部門に入って解決することができます. でも、正直言って無意味です。既に述べたように、これらのクラスには共通点は何もないため、Reflection を回避するインターフェイスを作成することをお勧めします。
また、そのオブジェクトで何をしたかったのですか? すべてのクラスに共通のメソッドを見つけて、関連するクラスが今後実装する新しいインターフェイスでそれらを使用できる可能性があります。
わかりました、執筆時点ですでに受け入れられている回答があることは知っていますが、それでも指摘したかったのですが、はい、できます。(あなたが何かをすることができないと言う人を見つけるたびに、私はダブルチェックするのが大好きです:P).