2

いくつかのクラスがあると仮定します

class Class1{ }
class Class2{ }
class Class3{ }

型変数があります

Type t = /*some type unknown at compile-time*/;

変数tはClass1またはClass2またはClass3です。そのクラスのインスタンスを作成したいと思います。私が知っているように、私は次のステートメントを使用することができます:

object instance = Activator.CreateInstance(t);

しかし、私はオブジェクトを受け取ります。そして問題は、このオブジェクトを変数にある型にキャストするにはどうすればよいかということですt。または、mabyの誰かが回避策を提案できます。ありがとう

4

4 に答える 4

5

反射を避けたい場合は、

public interface IClass { }
class Class1 : IClass { }
class Class2 : IClass { }
class Class3 : IClass { }

IClass instance = (IClass)Activator.CreateInstance(t);
于 2012-10-13T17:36:38.657 に答える
3

3つすべてが共有する共通の基本クラスまたはインターフェースがない限り、それはできません-それを呼び出すことができるのは「オブジェクト」だけです。それらすべてにインターフェースを実装させ、それにキャストすることを検討してください。

于 2012-10-13T17:37:30.887 に答える
2

dynamic次のキーワードを使用できます。

dynamic instance = Activator.CreateInstance(t);

これは を使用している場合と同じように機能しますobjectが、この場合、型は実行時にのみ認識されるため、プログラムを実行しない限り、すべてがサポートされます。Reflectionを扱うときは非常に一般的です。

詳細については、こちらをご覧ください

于 2012-10-13T17:56:27.407 に答える
1

あなたはできないと言われてきましたが、それでもできます。

まず、コードを見てみましょう:

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

于 2012-10-14T08:15:00.450 に答える