Wie überprüft man, ob ein Objekt Nullable ist?
Wie kann ich überprüfen, ob ein bestimmtes Objekt auf null gesetzt werden, in anderen Worten, wie die folgende Methode implementieren...
bool IsNullableValueType(object o)
{
...
}
EDIT: ich bin auf der Suche für nullable value types. Ich hatte keine ref-Arten in den Sinn.
//Note: This is just a sample. The code has been simplified
//to fit in a post.
public class BoolContainer
{
bool? myBool = true;
}
var bc = new BoolContainer();
const BindingFlags bindingFlags = BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance
;
object obj;
object o = (object)bc;
foreach (var fieldInfo in o.GetType().GetFields(bindingFlags))
{
obj = (object)fieldInfo.GetValue(o);
}
obj bezieht sich nun auf ein Objekt vom Typ bool
(System.Boolean
) mit dem Wert gleich true
. Was ich wirklich wollte, war ein Objekt des Typs Nullable<bool>
So, jetzt als eine Arbeit um die ich beschlossen zu prüfen, ob o-null-Werte zulässt, und erstellen Sie eine nullable-wrapper obj.
InformationsquelleAutor der Frage Sandeep Datta | 2008-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Typen der null -
Nullable<T>
- und Referenz-Typ.Jon hat mich korrigiert, es ist schwer zu bekommen, geben Sie, wenn boxed, aber man kann mit generics:
- also etwa wie unten. Dies ist eigentlich die Prüfung Typ
T
, aber mit derobj
parameter rein für den generischen Typ-Inferenz (um es einfach zu nennen) - es würde funktionieren fast identisch, ohne dieobj
param, obwohl.Aber das funktioniert nicht so gut, wenn Sie bereits Originalverpackung den Wert einer Objektvariable.
InformationsquelleAutor der Antwort Marc Gravell
Gibt es eine sehr einfache Lösung mit der Methode überlastungen
http://deanchalk.com/is-it-nullable/
Auszug:
dann
InformationsquelleAutor der Antwort Dean Chalk
Die Frage: "Wie um zu überprüfen, ob ein Typ auf null gesetzt werden?" ist eigentlich "Wie zu überprüfen, ob ein Typ ist
Nullable<>
?", das kann verallgemeinert werden, um "zu prüfen, Wie wenn ein Typ einen konstruierten Typ von generischer Typ?", so, dass es nicht nur Antworten auf die Frage "IstNullable<int>
eineNullable<>
?", aber auch "IstList<int>
eineList<>
?".Meisten der zur Verfügung gestellten Lösung verwenden Sie die
Nullable.GetUnderlyingType()
Methode, die offensichtlich nur mit dem Fall derNullable<>
. Ich konnte nicht sehen die Allgemeinen reflektierende Lösung, die die Arbeit mit jedem generischen Typ, also beschloss ich, fügen Sie es hier für die Nachwelt, auch wenn diese Frage schon beantwortet wurde vor langer Zeit.Um zu überprüfen, ob eine Art eine form von
Nullable<>
mit der spiegelung, müssen Sie zuerst konvertieren Sie Ihre konstruierten generischen Typ, zum BeispielNullable<int>
in die generische TypdefinitionNullable<>
. Sie können tun, dass durch dieGetGenericTypeDefinition()
Methode derType
Klasse. Sie können dann vergleichen die daraus resultierende Art zuNullable<>
:Das gleiche kann angewendet werden, um beliebige generische Typ:
Mehrere Arten mag das gleiche, aber eine unterschiedliche Anzahl von Typ-Argumente bedeutet, es ist eine ganz andere Art.
Seit
Type
Objekt instanziiert werden einmal pro Typ, Sie können überprüfen für Referenz-Gleichheit zwischen Ihnen. Also, wenn Sie wollen, um zu überprüfen, ob zwei Objekte den gleichen generischen Typ-definition können Sie schreiben:Wenn Sie möchten, um zu überprüfen, ob ein Objekt auf null gesetzt werden, anstatt eine
Type
dann können Sie mit der oben genannten Technik gemeinsam mit Marc Gravell ' s Lösung für die Erstellung von eine ziemlich einfache Methode:InformationsquelleAutor der Antwort Allon Guralnek
Gut, Sie könnte verwenden:
... aber ein Objekt selbst ist nicht null-Werte zulässt oder sonst - eine Typ ist. Wie haben Sie die Planung auf die Nutzung dieser?
InformationsquelleAutor der Antwort Jon Skeet
Dies funktioniert für mich und scheint einfach:
InformationsquelleAutor der Antwort Erik
Die einfachste Art, wie ich herausfinden kann, ist:
InformationsquelleAutor der Antwort CARLOS LOTH
Gibt es hier zwei Probleme: 1) testen, um zu sehen, ob ein Typ auf null gesetzt werden; und 2) testen, um zu sehen, ob ein Objekt stellt eine nullable-Typ.
Für Heft 1 (Prüfung Typ), hier ist eine Lösung, die ich verwendet habe, in meinem eigenen Systemen: TypeIsNullable-check-Lösung
Für Heft 2 (Test Objekt), Dean Kreide die Lösung von oben funktioniert für value-Typen, aber es funktioniert nicht für Referenz-Typen, da die Verwendung des <T> überlastung immer false zurück. Da Referenz-Typen sind von Natur aus null-Werte zulässt, Test eines Referenz-Typ sollte immer true zurück. Bitte beachten Sie den Hinweis [Über die "Zulässigkeit"] unten für eine Erläuterung dieser Semantik. So, hier ist meine Modifikation von Dean ' s Ansatz:
Und hier ist meine Modifikation der client-test-code für die obige Lösung:
Der Grund, warum ich geändert habe Dean ' s Ansatz in IsObjectNullable<T>(T t) ist, dass seine ursprünglichen Ansatz immer falsch zurückgegeben, die für ein Referenz-Typ. Da eine Methode wie IsObjectNullable sollte in der Lage sein zu handhaben Referenz-Typ-Werte und da alle Referenz-Typen sind von Natur aus null-Werte zulässt, dann, wenn ein Referenz-Typ oder null übergeben wird, sollte die Methode immer true zurück.
Den beiden oben genannten Methoden ersetzt werden könnten, die mit der single-Methode und erreichen die gleiche Ausgabe:
Jedoch, das problem mit dieser letzten single-method-Ansatz ist, dass die Leistung leidet, wenn ein Nullable<T> - parameter verwendet wird. Es braucht viel mehr Prozessor-Zeit zur Ausführung der letzten Zeile dieser Methode, als es dem compiler zu erlauben, wählen Sie die zweite Methode überlast angezeigt, wenn zuvor eine Nullable<T>-Typ-parameter wird in der IsObjectNullable nennen. Daher die optimale Lösung ist die Verwendung der zwei-Methode hier dargestellt.
NACHTEIL: Diese Methode funktioniert nur zuverlässig, wenn mit dem ursprünglichen Objekt-Referenz oder eine genaue Kopie, wie gezeigt in den Beispielen. Allerdings, wenn Sie eine null-Objekt ist boxed zu einem anderen Typ (z.B. Objekt, etc.) statt der noch in seiner ursprünglichen Nullable<> form, funktioniert diese Methode nicht zuverlässig. Wenn der code ruft diese Methode ist nicht mit dem original, ohne Verpackung-Objekt-Referenz oder eine genaue Kopie, es kann nicht zuverlässig bestimmen, das Objekt ist null-Zulässigkeit der Verwendung dieser Methode.
In den meisten coding-Szenarien, um zu bestimmen, die null-Zulässigkeit muss man stattdessen verlassen Sie sich auf die Prüfung der ursprünglichen Objekttyp nicht seine Referenz (z.B., muss der code zum Zugriff auf das Objekt die ursprünglichen Typ zu bestimmen, die null-Zulässigkeit). In diesen häufigeren Fällen, IsTypeNullable (siehe link) ist eine zuverlässige Methode zur Bestimmung der Zulässigkeit.
P. S. - Über die "Zulässigkeit"
Sollte ich wiederholen eine Aussage über die null-Zulässigkeit, die ich in einem separaten post, das gilt unmittelbar für richtig Auseinandersetzung mit diesem Thema. Das ist, glaube ich, dass der Fokus der Diskussion sollte nicht hier sein, wie Sie überprüfen, um zu sehen, ob ein Objekt einer generischen Nullable-Typ, sondern eher, ob man einen Wert zuweisen, der von null auf ein Objekt von Typ. In anderen Worten, ich denke, wir sollten ermitteln, ob ein Objekt geben Sie ist null-Werte zulässt, nicht, ob Sie null-Werte zulässt. Der Unterschied liegt in der Semantik, nämlich die praktischen Gründe für die Bestimmung der null-Zulässigkeit, die in der Regel alles, die was zählt.
In einem system, das Objekte mit Typen möglicherweise unbekannt, bis der run-time (web-services, remote-Aufrufe, Datenbanken, RSS-feeds, etc.), eine häufige Anforderung ist es, zu bestimmen, ob eine null werden kann, die dem Objekt zugewiesen wird oder ob ein Objekt enthalten kann, eine null. Die Durchführung solcher Operationen auf nicht-nullable-Typen werden wahrscheinlich Fehler produzieren, in der Regel Ausnahmen, die sind sehr teuer, sowohl in Bezug auf Leistung und Codierung-Anforderungen. Nehmen die hoch-bevorzugte Ansatz der proaktiven Vermeidung solcher Probleme ist es notwendig, um festzustellen, ob ein Objekt eines beliebigen Typs ist in der Lage mit einer null; D. H., ob es generell so ist 'nullable'.
In einer sehr praktischen und typischen Sinn, null-Zulässigkeit .NETTO bedeutet nicht notwendigerweise, dass ein Objekt-Typ ist eine form der null. In vielen Fällen in der Tat, Objekte sind Referenztypen, kann einen null-Wert enthalten, und somit sind alle null-Werte zulässt; keiner von Ihnen haben eine Nullable-Typ. Daher ist für praktische Zwecke in den meisten Szenarien, testen getan werden sollte, für das Allgemeine Konzept der null-Zulässigkeit, gegen die von der Implementierung abhängige Konzept der null. Also wir sollten nicht aufgehängt werden, durch die Fokussierung ausschließlich auf die .NET Nullable-Typ, sondern integrieren unser Verständnis Ihrer Anforderungen und das Verhalten im Prozess der Fokussierung auf das Allgemeine, das praktische Konzept der null-Zulässigkeit.
InformationsquelleAutor der Antwort Mark Jones
Seien Sie vorsichtig, wenn die Boxen einen nullable-Typ (
Nullable<int>
oder int? zum Beispiel :Es wird zu einer echten Referenz-Typ, so verlieren Sie die Tatsache, dass es war null-Werte zu.
InformationsquelleAutor der Antwort thinkbeforecoding
Die einfachste Lösung kam ich mit ist die Implementierung der Microsoft-Lösung (Gewusst wie: Identifizieren einer Nullable-Typ (C# - Programmierhandbuch)) als eine Erweiterung-Methode:
Diese kann dann aufgerufen werden, etwa so:
Das scheint auch eine logische Weg, um Zugang
IsNullable()
weil es passt, mit all den anderenIsXxxx()
Methoden derType
Klasse.InformationsquelleAutor der Antwort sclarke81
Vielleicht ein bisschen off-topic, aber dennoch einige interessante Informationen. Ich finde eine Menge Leute, die verwenden
Nullable.GetUnderlyingType() != null
zur Identität, wenn ein Typ auf null gesetzt werden. Das offensichtlich funktioniert, aber Microsoft berät die folgendentype.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)
(siehe http://msdn.microsoft.com/en-us/library/ms366789.aspx).Sah ich diese aus performance-Seite anzeigen. Das Fazit des test (eine million versuche) unten ist, dass, wenn ein Typ ist eine null, die Microsoft-option erzielt die beste Leistung.
Null-Werte zu.GetUnderlyingType(): 1335ms (3-mal langsamer)
GetGenericTypeDefinition() == typeof(Nullable<>): 500ms
Ich weiß, dass wir reden über eine kleine Menge von Zeit, aber jeder liebt, um zu zwicken, die die Millisekunden :-)! Also, wenn Sie Chef will Sie reduzieren einige Millisekunden, dann ist dies dein Retter...
InformationsquelleAutor der Antwort Roel van Megen
Dieser version:
:
InformationsquelleAutor der Antwort ipavlu
Hier ist was ich kam mit, da schien alles zu scheitern - zumindest nicht auf SPS - Portable Class Library /.NET Core mit >= C# 6
Lösung: Erweitern statische Methoden für jede Art
T
undNullable<T>
und verwenden Sie die Tatsache, dass die statische extension-Methode, passend zu den zugrunde liegenden Typ wird aufgerufen werden und Vorrang gegenüber dem AllgemeinenT
extension-Methode.Für
T
:und für
Nullable<T>
Mithilfe von Reflexion und
type.IsGenericType
... hat nicht funktioniert, meine aktuellen .NET-Laufzeiten. Noch haben die MSDN-Dokumentation helfen.if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}
Teil, weil die Reflection-API wurde geändert, ganz deutlich .NET Core.
InformationsquelleAutor der Antwort Lorenz Lo Sauer
einen einfachen Weg, dies zu tun:
diese sind meine unit-tests und alle bestanden
eigentlichen unit-tests
InformationsquelleAutor der Antwort VJPPaz