Hier muss eine wichtige Unterscheidung getroffen werden.
Die meisten Antworten hier beziehen sich speziell auf das ExpandoObject, das in der Frage erwähnt wird. Eine häufige Verwendung (und ein Grund, bei der Suche auf diese Frage zu stoßen) ist die Verwendung des ASP.Net MVC ViewBag. Dies ist eine benutzerdefinierte Implementierung / Unterklasse von DynamicObject, die keine Ausnahme auslöst, wenn Sie einen beliebigen Eigenschaftsnamen auf null prüfen. Angenommen, Sie deklarieren eine Eigenschaft wie:
@{
ViewBag.EnableThinger = true;
}
Angenommen, Sie möchten den Wert überprüfen und prüfen, ob er überhaupt festgelegt ist - ob er vorhanden ist. Folgendes ist gültig, wird kompiliert, wirft keine Ausnahmen und gibt Ihnen die richtige Antwort:
if (ViewBag.EnableThinger != null && ViewBag.EnableThinger)
{
// Do some stuff when EnableThinger is true
}
Entfernen Sie jetzt die Deklaration von EnableThinger. Der gleiche Code wird kompiliert und ordnungsgemäß ausgeführt. Keine Notwendigkeit zum Nachdenken.
Im Gegensatz zu ViewBag wird ExpandoObject ausgelöst, wenn Sie eine nicht vorhandene Eigenschaft auf Null prüfen. Um die sanftere Funktionalität von MVC ViewBag aus Ihren dynamic
Objekten herauszuholen , müssen Sie eine Implementierung von Dynamic verwenden, die nicht funktioniert.
Sie können einfach die genaue Implementierung in MVC ViewBag verwenden:
. . .
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = ViewData[binder.Name];
// since ViewDataDictionary always returns a result even if the key does not exist, always return true
return true;
}
. . .
https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DynamicViewDataDictionary.cs
Sie können sehen, dass es in MVC Views hier in MVC ViewPage eingebunden ist:
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/ViewPage.cs
Der Schlüssel für das elegante Verhalten von DynamicViewDataDictionary ist die Dictionary-Implementierung in ViewDataDictionary.
public object this[string key]
{
get
{
object value;
_innerDictionary.TryGetValue(key, out value);
return value;
}
set { _innerDictionary[key] = value; }
}
https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/ViewDataDictionary.cs
Mit anderen Worten, es gibt immer einen Wert für alle Schlüssel zurück, unabhängig davon, was darin enthalten ist - es gibt einfach null zurück, wenn nichts da ist. ViewDataDictionary muss jedoch an das MVC-Modell gebunden sein. Daher ist es besser, nur die eleganten Wörterbuchteile für die Verwendung außerhalb von MVC Views zu entfernen.
Es ist zu lang, um wirklich alle Eingeweide hier zu veröffentlichen - das meiste davon implementiert nur IDictionary -, aber hier ist ein dynamisches Objekt (Klasse DDict
), das keine Nullprüfungen für nicht deklarierte Eigenschaften auf Github auslöst:
https://github.com/b9chris/GracefulDynamicDictionary
Wenn Sie es nur über NuGet zu Ihrem Projekt hinzufügen möchten, heißt es GracefulDynamicDictionary .
data.myProperty
. es prüft, wastypeof data.myProperty
zurückkommt. Es ist richtig, dass esdata.myProperty
möglicherweise existiert und auf gesetzt istundefined
, aber in diesem Falltypeof
wird etwas anderes als zurückgegeben"undefined"
. Dieser Code funktioniert also.