4

ここでJonSkeetの回答を参照してください:ジェネリッククラスの型パラメーターとしてインスタンス化されたSystem.Typeを渡します

ジェネリック型の名前と、ジェネリックの型パラメーターである型の名前に基づいてジェネリック型をロードする必要があります。したがって、ジョンの例から、私は次のようになります。

string genName = "MyNamespace.Generic";
string itemName = "System.String";

タイプの名前と完全に正当化されたアセンブリ名/パスに基づいてタイプをロードする次のコードがあります。「シンプルタイプ」で問題なく動作します

public Type GetTypeOf(string assemblyPath, string className)
{
    var asmbly = System.Reflection.Assembly.LoadFrom(assemblyPath); //open assembly
    return asmbly.GetType(className, true, true); //throws error, not case sensitive
}

私はこれを次のように使用したいと思っていました:

//Get the types
var genTyp = GetTypeOf(genPath,genName);
var itemTyp = GetTypeOf(itemPath,itemName);

//Put them together:
var typ = getType.MakeGenericType(itemTyp);

これは、次のように最初の行に表示されSystem.TypeLoadExceptionます。

Could not load type <TypeName here> from assembly <AssemblyName here>

私は、完全なクラス名を提供することを含め、ジェネリックを作成するためのいくつかの順列を試しましたMyNamespace.Generic<System.String>。ジェネリック型を含む同じアセンブリからロードする非ジェネリック型を指定すると、正しく機能します。

4

2 に答える 2

4

残念ながら、ジェネリック型でGetTypeを使用することは、それほど読みやすくありません。総称パラメーターの場合でも、完全修飾型名を使用する必要があります。たとえば、TestType<object>次のようになります。

TestType`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

サンプルコードには型宣言が含まれていないため、これを試してみる必要があります。このコードスニペットを試して、デバッガーの内容を確認できます。

string typeName = typeof(MyNamespace.Generic<>).Name;
string fullTypeName = typeof(MyNamespace.Generic<>).FullName;

結果は、正しいタイプ名を取得するのに役立ちます。

于 2012-08-20T11:08:10.717 に答える
3

上記のCarstenの回答に基づいて、私は自分のGetTypeOf方法を次のように適応させました。

    public Type GetGenericTypeOf(string assemblyPath, string genericClass, string itemQualifiedClass)
    {
        string typString = String.Format("{0}`1[[{1}]]",genericClass,itemQualifiedClass)
        var asmbly = System.Reflection.Assembly.LoadFrom(assemblyPath); //open assembly
        return asmbly.GetType(typString, true, true); //throws error, not case sensitive
    }

その後、次のように使用できます。

var itemTyp = GetTypeOf(itemPath,itemName);
var genTyp = GetGenericTypeOf(genPath,genName,itemTyp.AssemblyQualifiedName);

//This genTyp is then good to go:
var genInst = Activator.CreateInstance(getTyp);

MakeGenericType返されるgenTypeはこのステップをバイパスするため、必要はありません。

これで、ブログのVB.Netバージョンのコードを含めて完全に書き留めまし

于 2012-08-20T11:38:26.003 に答える