Prüfen, ob Objekt hat null-in jeder Eigenschaft
Ich habe Klasse mit mehreren Eigenschaften;
public class Employee
{
public string TYPE { get; set; }
public int? SOURCE_ID { get; set; }
public string FIRST_NAME { get; set; }
public string LAST_NAME { get; set; }
public List<Department> departmentList { get; set; }
public List<Address> addressList { get; set; }
}
manchmal dieses Objekt zurückgeben, mich mit dem Wert in allen Sachen sagen
Employee emp = new Employee();
emp.FIRST_NAME= 'abc';
übrigen Werte sind null. Das ist OK
Aber, Wie kann ich überprüfen, wenn alle Werte in den Eigenschaften der Objekte null sind
wie string.IsNullOrEmpty()
für das Objekt ?
curretly ich bin prüfen wie diese;
if(emp.FIRST_NAME == null && emp.LAST_NAME == null && emp.TYPE == null && emp.departmentList == null ...)
- Ihr Objekt hat 6 Eigenschaften - einer von Ihnen ist nicht einmal die null-Werte zulässt - das macht 5. Du bist besser dran, nur Prüfung für null als eine komplexe Reflexion-basiert Szenario. Die Art und Weise Sie es tun ist wohl der richtige Weg.
- Was über das erstellen einer Funktion in der Klasse, die das für Sie übernimmt? So rufen Sie ihn, Wann immer Sie es brauchen.
- Ihrer aktuellen überprüfen ist sowohl relaiable und lesbar. Möchten Sie vielleicht, um es aufteilen auf mehrere Linien (eine Prüfung pro Zeile), auch wenn es nur riesige Zustand. Auch ein paar Versionen her, Sie Hinzugefügt, die null-bedingte Operatoren von C#6. Diese könnte eine bessere option für single-line-Prüfungen. docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
like string.IsNullOrEmpty() for object ?
Genau zu klären, was könnte ein Missverständnis sein hier: ein Objekt, dasnull
ist nicht das gleiche wie ein Objekt, dessen Eigenschaften sind allenull
. Wenn Sie nicht unterscheiden zwischen den beiden, Sie sind Gesicht eine Menge Missverständnisse, wenn Sie sprechen über Ihren code.- es gibt viele Missverständnisse darüber, konnte Sie schlagen alle guten Lesungen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie Reflexion, wie vorgeschlagen, durch Joel Harkes, z.B. ich haben zusammen diese wiederverwendbare, ready-to-use-extension-Methode
kann dann aufgerufen werden, wie dies
Und jetzt können Sie prüfen, die
areAllPropertiesNotNull
flag, das anzeigt, ob alle Eigenschaften, die nicht null sind. Zurücktrue
wenn alle Eigenschaften, die nicht null sind, ansonstenfalse
.Vorteile dieses Ansatzes
Nachteile
meiner Meinung nach, die geringen performance-overhead kann vernachlässigt werden, da die Entwicklung der Zeit und der Wiederholung des Codes reduziert, wenn der
ArePropertiesNotNull
, aber YMMV.All(propertyInfo => propertyInfo.GetValue(obj) != null)
würde nur true zurückgeben, wenn alle Eigenschaften sind nicht ist null. Ein Objekt mit allen Eigenschaften null machen würde das gleiche Ergebnis (falsch) als ein Objekt mit nur einer einzigen null-Eigenschaft (false), das ist nicht der Punkt der test nach OP ' s Beschreibung. Ich nehme an, Sie bedeutet entwederAny(propertyInfo => propertyInfo.GetValue(obj) != null)
oder! All(propertyInfo => propertyInfo.GetValue(obj) == null)
(beachten Sie die inversion auf der zweiten).Any
zu.All
so markiere ich diese als akzeptiert, und ich gehe davon aus, dass.GetValue()
zwei Parameter benötigt,.GetValue(obj, null)
.PropertyInfo.GetValue(object, object)
überlastung, die ich wählte zu gehen mitPropertyInfo.GetValue(object)
, so dass ich nicht haben, um passnull
. Natürlich können Sie entweder, seine völlig bis zu Ihnen und machen keinerlei Unterschied. Danke für die Markierung dieser als angenommen.Entweder Sie tun dies, indem Sie aufschreiben, den code zu überprüfen, jeder Eigenschaft manuell (beste option) oder Sie verwenden Sie reflektion, (mehr Lesen hier)
Beispiel aus hier
Beachten Sie, dass int und darf nicht null sein! und dessen default-Wert 0 sein. so ist es besser, um zu überprüfen
prop == default(int)
als== null
option 3
Andere Möglichkeit ist die Umsetzung INotifyPropertyChanged.
Auf eine änderung setzt eine Boolesche Feld den Wert
isDirty
zu wahren und als Sie nur brauchen, um zu überprüfen, ob dieser Wert true ist, zu wissen, ob eine Eigenschaft gesetzt wurde (auch wenn die Eigenschaft festgelegt wurde, mit null.Achtung: diese Methode kann jede Eigenschaft noch null sein, sondern nur überprüft, ob ein setter aufgerufen wurde (ändern eines Wertes).
int?
, nichtint
.