7

以下に示すようなジェネリッククラスがあります。

using System.Collections.Generic;

namespace MyNameSpace
{
    public class MyClass<T> : MyAnotherClass
    {
        public MyClass();
        public MyClass(T obj);
        public T Object { get; set; }
    }
}

throwing exception with message : "Could not load type 'MyClass' from assembly '//assembly details//' "次のコード行が null ( )を返す理由がわかりません

Type MyClassType = AssemblyContaingMyClass.GetType("MyNameSpace.MyClass");

ジェネリック クラスでAssembly.GetType(className)を使用するのは違法ですか?

実行時にジェネリック クラスの型を取得する別の方法を提案できますか?

この質問が基本的すぎる場合は、事前に感謝し、お詫び申し上げます。私はC#が初めてです。

編集 :

言及するのを忘れました。MyClass を含むアセンブリが実行時に読み込まれます。

4

4 に答える 4

10

実行時にジェネリック型にアクセスするには、CLR 命名を使用する必要があると思います。

AssemblyContaingMyClass.GetType("MyNameSpace.MyClass`1");

CLR では、ジェネリックは型パラメーターに言及せずに名前が付けられますが、backtick( `) の後にジェネリック型パラメーターの数が続きます。

于 2013-07-11T09:24:14.537 に答える
4

これを行うことができない理由は、簡単に言えば、という名前のクラスがないためですMyClass。のような名前の汎用クラス定義があり、名前がMyClass`1次のように見える型のすべてのバリアントがありますMyClass`1[System.String]

タイプを取得する最も簡単な方法は、次のtypeofようにキーワードを使用することです。

var genericType = typeof(MyClass<>);
var specificType = typeof(MyClass<string>);

ただし、名前でアセンブリからロードする必要がある場合は、次のように完全な名前を指定する必要があります。

var genericType = assembly.GetType("MyClass`1");
var specificType = assembly.GetType("MyClass`1[System.String]");

ジェネリック型の命名に関しては、ClassName`<number of generic arguments>

于 2013-07-11T09:34:53.303 に答える
2

これはあなたが求めているものですか?

    public class MyClass<T>
    {
        public T TheGeneric { get; set; }
    }


    Type theType = typeof(MyClass<>);
于 2013-07-11T09:25:05.200 に答える
0

試してください(Tなし):

Type template = typeof(MyNameSpace.MyClass<>);
于 2013-07-11T09:24:16.990 に答える