3

"MyCustomGenericCollection(of MyCustomObjectClass)" の形式の文字列としてジェネリックのクラス名しかなく、その元のアセンブリがわからない場合、そのオブジェクトのインスタンスを作成する最も簡単な方法は何ですか?

それが役に立てば、クラスが IMyCustomInterface を実装し、現在の AppDomain に読み込まれたアセンブリからのものであることがわかります。

Markus Olsson はここで優れた例を示しましたが、それをジェネリックに適用する方法がわかりません。

4

3 に答える 3

8

解析したら、Type.GetType(string)を使用して関連する型への参照を取得し、Type.MakeGenericType(Type[])を使用して必要な特定のジェネリック型を構築します。次に、Type.GetConstructor(Type[])を使用して特定のジェネリック型のコンストラクターへの参照を取得し、最後にConstructorInfo.Invokeを呼び出してオブジェクトのインスタンスを取得します。

Type t1 = Type.GetType("MyCustomGenericCollection");
Type t2 = Type.GetType("MyCustomObjectClass");
Type t3 = t1.MakeGenericType(new Type[] { t2 });
ConstructorInfo ci = t3.GetConstructor(Type.EmptyTypes);
object obj = ci.Invoke(null);
于 2008-09-24T22:04:08.280 に答える
2

MSDN の記事「方法: リフレクションを使用してジェネリック型を調べてインスタンス化する」では、リフレクションを使用してジェネリック型のインスタンスを作成する方法について説明しています。これを Marksus のサンプルと組み合わせて使用​​することで、うまくいけば始められるはずです。

于 2008-09-24T22:07:05.933 に答える
1

VB.NET への翻訳を気にしない場合は、このようなものが機能するはずです。

foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
    // find the type of the item
    Type itemType = assembly.GetType("MyCustomObjectClass", false);
    // if we didnt find it, go to the next assembly
    if (itemType == null)
    {
        continue;
    }
    // Now create a generic type for the collection
    Type colType = assembly.GetType("MyCusomgGenericCollection").MakeGenericType(itemType);;

    IMyCustomInterface result = (IMyCustomInterface)Activator.CreateInstance(colType);
    break;
}
于 2008-09-24T22:05:20.570 に答える