2016-08-24 3 views
14

Die Methode System.Type.GetGenericArguments() 'fehlt' von .NETStandard 1.0, und ich dachte, dass die TypeInfo.GenericTypeArguments der Ersatz für GetGenericArguments() ist, aber leider verhalten sie sich anders, wenn sie mit einem offenen generischen Typ geliefert werden. Nehmen Sie zum Beispiel des folgenden Code:Was entspricht Type.GetGenericArguments() in .NETStandard 1.0/.NET Core?

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

Während die GetGenericArguments() Verfahren des gattungs Argument TCommand zurückgibt, die GenericTypeArguments einfach ein leeres Array zurück, für den gleichen Open-generischen Typen. Wie lautet das genaue Verhalten von GenericTypeArguments und was entspricht Type.GetGenericArguments() in .NET Standard 1.0?

+3

@DavidL: .NETStandard ist ein [er .NET Standard Library eine formale Spezifikation von .NET APIs ist, die auf alle .NET verfügbar sein sollen Laufzeiten] (https://docs.microsoft.com/en-us/dotnet/articles/standard/library). .NET 1.0 ist ooooold, während .NETStandard neu ist; die neue PCL, um genauer zu sein. – Steven

+0

Hinweis 1 ist ein Standard und einer ist eine Implementierung des Standards. Aus dem Artikel: ".NET Core 1.0 implementiert die .NET-Standardbibliothek 1.6" – AaronLS

+0

Außerdem laut diesem Diagramm war die einzige Implementierung von .NET Standard 1.0 Windows Phone Silverlight 8.0. – AaronLS

Antwort

11

Nach weiterer Untersuchung scheint die Type.GenericTypeArguments nur etwas zurückzugeben, wenn der Typ keine generische Typdefinition ist. Die TypeInfo.GenericTypeParameters andererseits gibt nur alle zurück, wenn der Typ eine generische Typdefinition ist.

Der folgende Code imitiert das Verhalten von Type.GetGenericArguments():

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

Dies könnte sich schließlich als Kommentar (keine Antwort) herausstellen.

On NET 4.6.1 gibt es zwei Mitglieder auf System.Type, nämlich:

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

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

plus ein Mitglied bei System.Reflection.TypeInfo, nämlich:

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

für insgesamt drei Mitglieder .

Die beiden erstgenannten Mitglieder sind aber auch von System.Reflection.TypeInfo geerbt, eine Unterklasse von System.Type.

Auf .NET 4.6.1, wenn Sie type.GetTypeInfo().GenericTypeArguments (wie in Ihrer Frage) tun, rufen Sie wirklich die Eigenschaft auf Type, d. H. Mein Mitglied markiert /* 2 */.

+0

Das ist eine interessante Beobachtung. Leider beantwortet es meine Frage nicht. Irgendeine Idee, wie man die offenen Argumente des generischen Typs unter .NET Standard 1.0 bekommt? – Steven

+0

@Steven Nein, leider nicht. Wenn ich den Kommentar von Scott Chamberlain zu Ihrer Frage richtig verstehe, könnte es eine Chance geben, dass jemand zu einer Lösung für .NET Standard 1.5 (_edit: _ möglicherweise sogar .NET Standard 1.1) oder später inspirieren kann. Wie verwirrend sind die drei Namen 'GetGenericArguments()', 'GenericTypeArguments' und' GenericTypeParameters'. In mancher Hinsicht ist Microsoft .NET Framework unordentlich geworden. Ist der Zweck von ".NET Standard" (auch) solche Dinge aufzuräumen? –

Verwandte Themen