22

このSystem.Type型には、プロパティIsGenericTypeDefinitionおよびContainsGenericParameters が含まれています。MSDN のドキュメントを読んだ後、型がオープン ジェネリック型かクローズド ジェネリック型かを確認するために、両方のプロパティが存在すると結論付けました。

ただし、この 2 つの違いと、どちらを使用するかがわかりません。

4

3 に答える 3

23

Type.ContainsGenericParameters再帰的です:

var genericList = typeof(List<>);
var listOfSomeUnknownTypeOfList = genericList.MakeGenericType(genericList);
listOfSomeUnknownTypeOfList.IsGenericTypeDefinition;  // => false
listOfSomeUnknownTypeOfList.ContainsGenericParameters; // => true

ここで起こることはlistOfSomeUnknownTypeOfList、その型パラメーターが一部の T の a であることがわかっているため、それ自体がジェネリック型定義ではないということですList<T>。ただし、の型listOfSomeUnknownTypeOfListは正確にはわかっていないため (型引数が型定義であるため)、ContainsGenericParametersistrueです。

于 2012-10-22T13:46:45.740 に答える
5

ContainsGenericParametersの再帰バージョンですIsGenericTypeDefinition

typeof(List<Func<>>).IsGenericTypeDefinitionは偽です。

于 2012-10-22T13:46:05.757 に答える
4

IsGenericTypeいくつかの違いを強調しようとする下の表があります。

IsGenericTypeDefinitionプロパティは true です。

ジェネリック型を定義します。構築された型は、ジェネリック型定義を表すオブジェクトでMakeGenericTypeメソッドを呼び出し、型引数の配列を指定することによって作成されます。Type

また:

ContainsGenericParametersプロパティは true です。

ContainsGenericParameters例としては、割り当てられていない型パラメーターを持つジェネリック型、ジェネリック型定義または開いて構築された型で入れ子になっている型、またはプロパティが trueである型引数を持つジェネリック型があります。

したがって、それらは正確には同じではありません。

于 2012-10-22T13:48:32.333 に答える