2016-08-24 6 views
14

System.Type.GetGenericArguments()のメソッドが.NET Standard 1.0から '欠落しています'、TypeInfo.GenericTypeArgumentsGetGenericArguments()の代わりであると思っていましたが、オープンジェネリック型で提供されたときとは違った動作をします。例えば、次のコードを取る:.NET Standard/.NET CoreのType.GetGenericArguments()に相当するものは何ですか?

Type type = typeof(ICommandHandler<>); 
type.GetGenericArguments(); // return { TCommand } 
type.GetTypeInfo().GenericTypeArguments; // returns empty array 
GetGenericArguments()

方法は、ジェネリック型引数TCommandを返しながら、GenericTypeArgumentsは単に同じオープンジェネリック型のための空の配列を返します。

GenericTypeArgumentsの正確な動作と、.NET標準1.0のType.GetGenericArguments()に相当するものは何ですか?

+3

@DavidL:.NETStandardは[彼は標準ライブラリは、すべての.NET上で利用可能であることを意図している.NETのAPIの正式な仕様書です.NETランタイム](https://docs.microsoft.com/en-us/dotnet/articles/standard/library)。 .NET標準は新しいですが、.NET 1.0は大変です。新しいPCLはより正確になるはずです。 – Steven

+0

1つは標準であり、1つは標準の実装です。 「.NET Core 1.0で.NET Standard Library 1.6が実装されている」 – AaronLS

+0

さらに、この図によれば、.NET Standard 1.0の実装はWindows Phone Silverlight 8.0のみでした。 – AaronLS

答えて

11

Type.GenericTypeArgumentsは、型がジェネリック型定義でない場合にのみ、何かを返すように見えます。一方、TypeInfo.GenericTypeParametersは、型がジェネリック型定義の場合にのみ、すべてを返します。

次のコードを模倣Type.GetGenericArguments()の行動:

type.GetTypeInfo().IsGenericTypeDefinition 
    ? type.GetTypeInfo().GenericTypeParameters 
    : type.GetTypeInfo().GenericTypeArguments; 
4

結局のところ、これはコメントである可能性があります(答えではありません)。 .NET 4.6.1オン

は、二つの部材、すなわち、System.Typeである:System.Reflection.TypeInfo

/* 1 */ type.GetGenericArguments()    // returns { TCommand, } 

/* 2 */ type.GenericTypeArguments    // returns empty array 

プラスつのメンバー、すなわち:

/* 3 */ type.GetTypeInfo().GenericTypeParameters // returns { TCommand, } 

メンバーの合計。

しかし、2つの最初に述べたメンバーでもあるは、System.Reflection.TypeInfoによってSystem.Typeのサブクラスをを継承しました。

type.GetTypeInfo().GenericTypeArguments(ご質問のとおり)では、実際にTypeのプロパティ、つまり/* 2 */と表示されたメンバーを呼び出します。

+0

これは興味深い観察です。残念ながら、私の質問には答えません。どのように.NET標準1.0の下でオープンジェネリック型引数を取得するか考えていますか? – Steven

+0

@スティーブンいいえ、残念ながら。 Scott Chamberlain氏のご質問が正しく理解されていれば、.NET Standard 1.5(_edit:_多分.NET Standard 1.1でも可)のソリューションにインスピレーションを与える可能性があります。 'GetGenericArguments()'、 'GenericTypeArguments'、' GenericTypeParameters'の3つの名前を混乱させる方法。いくつかの意味で、Microsoft .NET Frameworkは面倒なものになっています。このようなものを整理するために「.NET Standard」(また)の目的はありますか? –

関連する問題