Une distinction importante doit être faite ici.
La plupart des réponses ici sont spécifiques à ExpandoObject qui est mentionné dans la question. Mais une utilisation courante (et une raison de se poser sur cette question lors de la recherche) est l'utilisation du ViewBag ASP.Net MVC. C'est une implémentation / sous-classe personnalisée de DynamicObject, qui ne lèvera pas d'exception lorsque vous vérifiez un nom de propriété arbitraire pour null. Supposons que vous puissiez déclarer une propriété comme:
@{
ViewBag.EnableThinger = true;
}
Supposons alors que vous vouliez vérifier sa valeur, et si elle est même définie - si elle existe. Ce qui suit est valide, compilera, ne lèvera aucune exception et vous donnera la bonne réponse:
if (ViewBag.EnableThinger != null && ViewBag.EnableThinger)
{
}
Débarrassez-vous maintenant de la déclaration de EnableThinger. Le même code se compile et s'exécute correctement. Pas besoin de réflexion.
Contrairement à ViewBag, ExpandoObject lancera si vous vérifiez la valeur null sur une propriété qui n'existe pas. Afin d'obtenir les fonctionnalités plus douces de MVC ViewBag de vos dynamic
objets, vous devrez utiliser une implémentation de dynamique qui ne lance pas.
Vous pouvez simplement utiliser l'implémentation exacte dans MVC ViewBag:
. . .
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = ViewData[binder.Name];
return true;
}
. . .
https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DynamicViewDataDictionary.cs
Vous pouvez le voir lié aux vues MVC ici, dans MVC ViewPage:
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/ViewPage.cs
La clé du comportement gracieux de DynamicViewDataDictionary est l'implémentation du dictionnaire sur ViewDataDictionary, ici:
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
In other words, it always returns a value for all keys, regardless of what's in it - it simply returns null when nothing's there. But, ViewDataDictionary has the burden of being tied to MVC's Model, so it's better to strip out just the graceful dictionary parts for use outside MVC Views.
It's too long to really post all the guts here - most of it just implementing IDictionary - but here's a dynamic object (class DDict
) that doesn't throw for null checks on properties that haven't been declared, on Github:
https://github.com/b9chris/GracefulDynamicDictionary
If you just want to add it to your project via NuGet, its name is GracefulDynamicDictionary.
data.myProperty
; il vérifie ce quitypeof data.myProperty
revient. Il est correct que celadata.myProperty
puisse exister et être défini surundefined
, mais dans ce cas,typeof
il renverra autre chose que"undefined"
. Donc, ce code fonctionne.