2016-08-24 8 views
14

Metoda jest "brakująca" z .NETStandard 1.0, i myślałem, że TypeInfo.GenericTypeArguments był zamiennikiem dla GetGenericArguments(), ale niestety zachowują się inaczej, gdy są dostarczane z otwartym typem ogólnym. Weźmy na przykład następujące kod:Co to jest odpowiednik Type.GetGenericArguments() w .NETStandard 1.0/.NET Core?

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

Chociaż sposób GetGenericArguments() zwraca ogólny typ argumentu TCommand The GenericTypeArguments prostu powraca pustą tablicę w tym samym otwartych ogólny typ.

Jakie jest dokładne zachowanie GenericTypeArguments i jaki jest odpowiednik Type.GetGenericArguments() w .NET Standard 1.0?

+3

@DavidL: .NETStandard jest [on NET Biblioteka standardowa jest formalna specyfikacja .NET API, które mają być dostępne na wszystkich .NET runtimes] (https://docs.microsoft.com/en-us/dotnet/articles/standard/library). .NET 1.0 jest ooooold, a .NETStandard jest nowy; nowy PCL jest bardziej precyzyjny. – Steven

+0

Uwaga jeden jest standardem, a drugi jest implementacją standardu. Z artykułu: ".NET Core 1.0 implementuje .NET Standard Library 1.6" – AaronLS

+0

Dodatkowo, zgodnie z tym wykresem, jedyną implementacją .NET Standard 1.0 był Windows Phone Silverlight 8.0. – AaronLS

Odpowiedz

11

Po dokładniejszym zbadaniu, Type.GenericTypeArguments wydaje się zwracać tylko, jeśli typ nie jest definicją typu ogólnego. Z drugiej strony, TypeInfo.GenericTypeParameters zwraca tylko wtedy, gdy typ jest definicją typu ogólnego.

Poniższe kod naśladuje zachowanie Type.GetGenericArguments():

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

Może to okazać się komentarzem (a nie odpowiedzią).

Na NET 4.6.1, istnieją dwa elementy na System.Type, a mianowicie:

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

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

plus jeden członek na System.Reflection.TypeInfo, a mianowicie:

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

w sumie trzy członków .

Jednak dwaj pierwsi wspomniani członkowie również są odziedziczeni przez System.Reflection.TypeInfo, podklasę System.Type.

Na .NET 4.6.1, po wykonaniu type.GetTypeInfo().GenericTypeArguments (jak w pytaniu), naprawdę zadzwonić na właściwość na Type, tj. Mój członek oznaczony /* 2 */.

+0

To interesująca obserwacja. Niestety nie odpowiada na moje pytanie. Każdy pomysł, jak uzyskać otwarte argumenty typu rodzajowego w .NET Standard 1.0? – Steven

+0

@Steven Nie, niestety nie. Jeśli dobrze zrozumiem komentarz Scotta Chamberlaina do twojego pytania, być może istnieje możliwość, że może to zainspirować kogoś do rozwiązania .NET Standard 1.5 (_edit: _ może nawet .NET Standard 1.1) lub nowszego. Jak mylące jest posiadanie trzech nazw 'GetGenericArguments()', 'GenericTypeArguments' oraz' GenericTypeParameters'. W pewnym sensie Microsoft .NET Framework stał się brudny. Czy celem ".NET Standard" (także) jest uporządkowanie takich rzeczy? –