2016-08-24 61 views
14

方法System.Type.GetGenericArguments()從.NETStandard 1.0'缺少',我認爲TypeInfo.GenericTypeArgumentsGetGenericArguments()的替代品,但不幸的是,它們在提供開放式泛型類型時表現不同。就拿以下代碼:.NETStandard 1.0/.NET Core中的Type.GetGenericArguments()的等效參數是什麼?

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

雖然GetGenericArguments()方法返回的一般類型參數TCommand,所述GenericTypeArguments簡單地返回相同的開放泛型型空數組。

在.NET標準1.0中,GenericTypeArgumentsType.GetGenericArguments()的等價物的確切行爲是什麼?

+3

@DavidL:.NETStandard是[他.NET標準庫是旨在適用於所有.NET .NET API的正式規範運行時間](https://docs.microsoft.com/en-us/dotnet/articles/standard/library)。 .NET 1.0是新興的,而.NETStandard是新的;新的PCL更加精確。 – Steven

+0

注意一個是標準,一個是標準的實現。從文章:「.NET Core 1.0實現.NET標準庫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,即:

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

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

加一構件上System.Reflection.TypeInfo,即:

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

總共成員。

然而,這兩個首先提到的成員也是繼承通過System.Reflection.TypeInfo,的System.Type一個子類。

在.NET 4.6.1上,當你做type.GetTypeInfo().GenericTypeArguments(和你的問題一樣)時,你確實叫Type,即我的成員標記爲/* 2 */

+0

這是一個有趣的觀察。不幸的是,它不能回答我的問題。任何想法如何獲得.NET標準1.0下的開放泛型類型參數? – Steven

+0

@Steven不,不幸的是沒有。如果我正確理解了Scott Chamberlain對你的問題的評論,那麼可能有機會激發某人爲.NET Standard 1.5(_edit:_甚至可能是.NET Standard 1.1)或更高版本提供解決方案。如何混淆有三個名稱:GetGenericArguments(),GenericTypeArguments和GenericTypeParameters。在某些意義上,Microsoft .NET Framework已變得混亂。 「.NET標準」的目的是(也)清理這樣的事情嗎? –

相關問題