2010-02-19 4 views
15

Für eine Type, gibt es eine Eigenschaft IsClass in C#, aber wie eine Type ist eine Struktur zu entscheiden?Wie man einen Typ entscheidet, ist eine kundenspezifische Struktur?

Obwohl IsValueType eine notwendige Bedingung ist, ist es offensichtlich nicht genug. Für eine int ist auch ein Werttyp.

Jemand schlägt vor, den folgenden Code:

bool IsStruct = type.IsValueType && !type.IsEnum && !type.IsPrimitive; 

Aber ich bin nicht sicher, ob es eine genaue Methode ist. Die Formel sollte den Unterschied zwischen struct und anderen Typen wie DateTime, int und array s unterscheiden.

Da einige Freunde haben darauf hingewiesen, dass hier, ich meine benutzerdefinierte Struktur und nicht vordefinierte Typen, wie DateTime.

+2

Ich bin mir nicht sicher, ob ich die Frage verstehe. Eine DateTime ** ist ** eine Struktur. Warum würdest du dort falsch zurückkehren? –

+3

Eigentlich ist Int auch ein Strukturtyp. Die Sprachspezifikation besagt, dass "C# eine Reihe von vordefinierten Strukturtypen bereitstellt, die als einfache Typen bezeichnet werden". –

+2

Es wäre interessant zu wissen, warum es dich interessiert. Was machst du? Es könnte einen besseren Weg geben, um zu tun, was Sie wollen. –

Antwort

8

Technisch gesehen ist ein int auch eine Struktur. IsPrimitive prüft nur, ob der Typ einer der primitiven Typen ist, die die CLR ein wenig anders behandelt. Sie sollten mit dem Vorschlag in Ordnung sein.

Wenn Sie nur benutzerdefinierte Strukturen möchten (dh die nicht von der BCL bereitgestellt werden), können Sie möglicherweise Typen mit einem FullName ausschließen, der mit "System." beginnt, oder nur diejenigen einschließen, die Sie interessieren, indem Sie nach Assembly oder Namespace filtern oder verwenden Sie ein benutzerdefiniertes Attribut.

+2

+1 Oder '" Microsoft. "' Oder '" FSharp. "' Oder. . . Ich denke, er wird es schwer haben, sie alle zu eliminieren. –

2

Sollte mindestens

bool isStruct = type.IsValueType && !type.IsEnum && 
       !type.IsPrimitive && type != typeof(decimal); 
0

Du wirst sein eine harte Zeit mit diesem haben. Das Basis-Framework weiß nicht, was alle vordefinierten Typen in anderen Teilen des Frameworks sind. Es ist zum Beispiel nicht zu erwarten, dass das Kern-Framework etwa System.Drawing.Point kennt.

OregonGhost hat wahrscheinlich die beste answer: Holen Sie sich die Typ-Informationen und überprüfen Sie die FullName Eigenschaft, um zu sehen, ob es mit "System." beginnt. Aber Sie müssen auch nach "Microsoft." und "FSharp" und möglicherweise anderen suchen. Klicken Sie einfach in Visual Studio auf "Verweis hinzufügen" und sehen Sie, welche Namen angezeigt werden.

Und dann riskieren Sie möglicherweise, zu viel zu blockieren. Microsoft verteilt einige Assemblys über NuGet-Pakete, und die Typen in diesen Assemblys haben oft Namen, die mit "System." oder "Microsoft." beginnen. Denken Sie über diese "eingebauten" Typen nach, obwohl sie nicht mit dem Framework vertrieben werden?

1

http://msdn.microsoft.com/en-us/library/bfft1t3c.aspx sagt: IsValueType wahr ist, wenn Typ in ist {Bool, Byte, Zeichen, dezimal, Doppel-, Enum, float, int, long, sbyte, kurz, struct, uint, ulong, ushort}.

http://msdn.microsoft.com/en-us/library/system.type.isprimitive%28v=vs.110%29.aspx sagt: IsPrimitive wahr ist, wenn Typ in ist {Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Doppel- und Einzel}.

als für IsStruct können Sie die Methode wie folgt verwenden:

public static bool IsStruct(this Type type) 
{ 
    return type.IsValueType 
      && !type.IsPrimitive 
      && !type.IsEnum 
      && type != typeof(decimal); 
} 
0

Er arbeitete für mich x.PropertyType.IsSecurityTransparent & & x!.PropertyType.IsClass

0

keine perfekte Lösung, aber Sie können Sie innerhalb der Baugruppen immer überlegen, nach bekannten Arten die Suche einzuschränken suchen wollen:

System.Reflection.Assembly.GetAssembly(tyepof(OneOfMyTypes)) 
    .GetExportedTypes() 
    .Where(t => t.IsValueType); 

Das hilft beseitigen Fehlalarme (? Sicherer), aber es ist weniger tragbar.

Verwandte Themen