En javascript, vous pouvez détecter si une propriété est définie à l’aide du mot clé undefined :
Comment feriez-vous cela en c# à l’aide du mot clé dynamic avec un `` et sans lever d’exception ?
En javascript, vous pouvez détecter si une propriété est définie à l’aide du mot clé undefined :
Comment feriez-vous cela en c# à l’aide du mot clé dynamic avec un `` et sans lever d’exception ?
Une distinction importante doit être faite ici.
La plupart des réponses ici sont spécifiques à la ExpandoObject qui est mentionné dans la question. Mais une utilisation courante (et la raison pour atterrir sur cette question lors de la recherche) lors de l'utilisation de la ASP.Net MVC ViewBag. C'est une coutume de mise en œuvre/sous-classe de DynamicObject, ce qui ne va pas faire une Exception lorsque vous vérifiez tout arbitraire nom de la propriété pour les nuls. Supposons que vous pouvez déclarer une propriété comme:
@{
ViewBag.EnableThinger = true;
}
Ensuite, supposons que vous vouliez vérifier sa valeur, et si c'est même set - si elle existe. Ce qui suit est valable, de compiler, de ne pas jeter des exceptions, et vous donne la bonne réponse:
if (ViewBag.EnableThinger != null && ViewBag.EnableThinger)
{
// Do some stuff when EnableThinger is true
}
Maintenant, se débarrasser de la déclaration de EnableThinger. Même code compile et s'exécute correctement. Nul besoin de réflexion.
Cela dit, ExpandoObject va jeter si vous rechercher la valeur null sur une propriété qui n'existe pas. Afin d'obtenir MVC ViewBag du plus doux des fonctionnalités de les autres dynamic
objets, vous aurez besoin d'utiliser une mise en œuvre de dynamiques qui ne veut pas jeter.
Vous pouvez simplement utiliser l'exacte mise en œuvre dans MVC ViewBag:
. . .
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;
}
. . .
Vous pouvez voir qu'il est lié dans MVC Vues ici, dans MVC ViewPage:
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/ViewPage.cs
La clé de la DynamicViewDataDictionary gracieuse de comportement est le Dictionnaire de la mise en œuvre 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
En d'autres termes, il renvoie toujours une valeur pour toutes les touches, indépendamment de ce qu'il contient - il simplement renvoie la valeur null lorsque rien n'est là. Mais, ViewDataDictionary a le fardeau d'être lié à la MVC du Modèle, il est donc préférable de bande, la gracieuse dictionnaire pièces pour utilisation à l'extérieur MVC points de Vue.
C'est trop long à vraiment écrire toutes les tripes ici - plus de la mise en œuvre de IDictionary - mais ici, c'est un objet dynamique qui ne renvoie pas null contrôles sur les propriétés qui n'ont pas été déclarées, sur Github:
https://github.com/b9chris/GracefulDynamicDictionary
Si vous souhaitez simplement ajouter à votre projet sur NuGet, son nom est GracefulDynamicDictionary.
J'ai répondu à une question très semblable récemment: http://stackoverflow.com/questions/2634858/how-do-i-reflect-over-the-members-of-dynamic-object
Peu de temps, ExpandoObject n'est pas la seule dynamique de l'objet que vous pourriez obtenir. La réflexion pourrait fonctionner pour les types statiques (les types qui ne mettent pas en œuvre idynamicmetaobjectprovider fournie par). Pour les types qui implémentent cette interface, la réflexion est pratiquement inutile. Pour ExpandoObject, vous pouvez simplement vérifier si la propriété est définie comme une clé dans le dictionnaire sous-jacent. Pour les autres implémentations, il peut être difficile et, parfois, la seule façon est de travailler avec des exceptions. Pour plus de détails, suivez le lien ci-dessus.
Mise à jour : Vous pouvez utiliser des délégués et essayer d’obtenir une valeur de la propriété de l’objet dynamique si elle existe. S’il n’y a aucun bien, simplement intercepter l’exception et retourne la valeur false.
Jetez un coup d’oeil, il fonctionne très bien pour moi :
La sortie du code est le suivant :
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.