ジェネリックでType.GetType()を使用できないのはなぜですか?

c# generics
ジェネリックでType.GetType()を使用できないのはなぜですか?

特定の型の文字列表現を使用して、いくつかの参照を削除しようとしています。 しかし、コンパイラは、ジェネリックメソッドの場合に私が望んでいるようにはさせません。 私はこれを試しました:

IContainer container = components as IContainer;
Type type = Type.GetType("MyNamespace.MyType");
foreach (var component in container.Components.OfType()) {
    ...
}

この:

foreach (var component in container.Components.OfType()) {
    ...
}

最初のループでは、「演算子 ‘<‘は、 ‘method group’および ‘System.Type’型のオペランドに適用できません。2番目のループでは、何らかの理由で変数が範囲外です。 なぜこれが起こっているのですか、それを回避する方法はありますか? 前もって感謝します。

  1  1


ベストアンサー

Type.MakeGenericTypeを使用できます。 例:

Type.GetType("YourGenericType").MakeGenericType(Type.GetType("yourTypeParameter"))

文字列から決定された型パラメーターを持つリストの例:

typeof(List<>).MakeGenericType(Type.GetType("System.String"))

これはあなたに同じを与えます

typeof(List)

ただし、Enumerable.OfTypeを呼び出すためにTypeインスタンスを使用することはできません。 代わりにこのようなものを使うことができます:

foreach (var component in container.Components.Where(o => o.GetType().IsAssignableFrom(yourType)))
{
    //...
}

もちろん、これはすぐに厄介になるので、あなたのアプローチを変えることを検討します。 なぜ文字列を使用したくないのですか?

5


ジェネリック型引数の代わりに変数を使用することはできません(<と>の間)。 コンパイル時に決定される型である必要があります。

しかし、あなたの例では、これはすでに事実です。 そのまま使えませんか

foreach (var component in container.Components.OfType()) {
...
}

2


あなたはこれを求めている:

foreach (var component in container.Components.OfType()) {
...
}

問題は、文字列ではなくジェネリックで実際の型式を使用する必要があることです。 文字列を本当に使用する必要がある場合は、リフレクションを使用して型を作成できます。

0


タイトルとURLをコピーしました