Utilisez des dictionnaires pour accéder efficacement aux propriétés des objets dynamiques
Contexte :
Lors de la création d'objets dynamiques à l'aide du mot-clé dynamic
dans .NET 4, obtenir un dictionnaire de propriétés et de leurs valeurs peut être un défi. Les méthodes de réflexion traditionnelles peuvent ne pas suffire.
Attributs des objets dynamiques :
Les objets dynamiques dans .NET, tels que ExpandoObject
, créent des propriétés dynamiquement au moment de l'exécution. Le compilateur ne connaît pas ces propriétés à l'avance, ce qui rend difficile leur accès à l'aide des techniques standards.
Solution pour ExpandoObject :
Heureusement pour ExpandoObject
il existe une solution simple. Puisque ExpandoObject
implémente l'interface IDictionary<string, object>
, nous pouvons directement caster l'objet dynamique vers ce type et accéder à ses propriétés sous la forme d'un dictionnaire :
IDictionary<string, object> propertyValues = (IDictionary<string, object>)s;
Objets dynamiques universels :
Cependant, cette approche ne fonctionne pas avec les objets dynamiques génériques qui n'héritent pas de IDictionary<string, object>
. Dans ce cas, nous devons tirer parti du Dynamic Language Runtime (DLR). Cela implique d'utiliser l'interface IDynamicMetaObjectProvider
:
var metaObject = (IDynamicMetaObjectProvider)s; var properties = metaObject.GetMetaObject(Expression.Constant(s)).GetDynamicMemberNames();
Cette méthode implique des opérations DLR plus complexes et doit être envisagée pour les objets nonExpandoObject
dynamiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!