2

以下のコードを検討してください。

void fun1(string typeName)
{
    object adap = Activator.CreateInstance(typeName);
    adap.dowork(); //won't compile because of strongly typed.
}

を使用Activator.CreateInstance()すると、任意の型のインスタンスを簡単に作成できますが、設計時に型名がわからない場合は、実際の型にダウンキャストすることもできません。

Activator.CreateInstance私の質問は、設計時にタイプ名がわからないため、適切なタイプにダウンキャストできない場合に作成されたインスタンスの関数をどのように呼び出すことができるかということですが、関数が存在することはわかっています。

私は自分自身を明確にしたことを願っています。

4

3 に答える 3

6

できることの 1 つは、型に割り当てることですdynamic

dynamic adap = Activator.CreateInstance(typeName);
adap.dowork(); //this now compiles

メソッド名がわかっている場合は、リフレクションを使用してメソッドを動的に呼び出すこともできます。

于 2013-04-22T17:51:47.640 に答える
3

最良のオプションは、一般的なインターフェイスまたは基本クラスを知っており、それにキャストすることです。ただし、それが不可能な場合は、次を使用してダックタイプできます

dynamic adap = ...

残りのコードはそのままです。

それが不可能な場合 (間違った .net バージョンなど)、リフレクションを使用する必要があります。

于 2013-04-22T17:51:36.547 に答える
1

typeNamemethod があることがわかっている場合はdoWork、型に次のようなインターフェイスを実装することをお勧めします。

interface IDoWorkSupport
{
    void DorWork();
}

次に、次のようなコードを作成できます。

var adap = (IDoWorkSupport) Activator.CreateInstance(typeName);
adap.DoWork(); //this now compiles

この場合、よりオブジェクト指向のソリューションです。

于 2013-08-21T06:58:26.483 に答える