2010-02-25 5 views
3

J'ai eu du mal à obtenir un exemple DynamicObject simple fonctionnant dans .NET 3.5..Net 3.5 DLR Aide DynamicObject

En utilisant la dernière version du DLR de CodePlex, je ne l'ai pas été en mesure de comprendre ce que le .NET 3.5 équivalent à ce qui suit est:

public class DynamicObjectBag : DynamicObject 
{ 
    private Dictionary<string, object> _properties = new Dictionary<string, object>(); 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     return _properties.TryGetValue(binder.Name, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     _properties[binder.Name] = value; 
     return true; 
    } 
} 

dynamic foo = new DynamicObjectBag(); 
foo.Val1 = 3; 
foo.Val2 = “Value 2”; 

Ceci est bien sûr un exemple simplifié. Je prévois de dériver des classes à partir de DynamicObject afin que je puisse utiliser à la fois les propriétés d'objet direct et les propriétés stockées dans le dictionnaire en utilisant la même notation de style de point sémantique ou les mêmes méthodes d'accès. L'objectif est d'avoir des objets compatibles DLR pour une utilisation dans les langages pris en charge par DLR et de fournir une compatibilité future avec les capacités DLR .NET 4.0 lorsque l'application peut être mise à niveau vers .NET 4.0.

Mon problème est que pre-.NET 4.0 je n'ai pas de concept équivalent au mot-clé dynamique. Les méthodes telles que TryGetMember ont un paramètre liant comme GetMemberBinder. Maintenant. NET 4.0 a un classeur par défaut C# disponible qui permettra la liaison à se produire lors de l'utilisation du mot-clé dynamique, mais j'ai été incapable de trouver ou de déterminer comment effectuer l'équivalent dans .NET 3.5.

Pour le moment, je crois que je devrais écrire un classeur personnalisé qui dupliquerait fondamentalement le type de logique disponible dans le classeur C# par défaut .NET 4.0.

S'il vous plaît quelqu'un me diriger dans la bonne direction sur la façon dont je peux utiliser un DynamicObject dans .NET 3.5 et ajouter des propriétés à l'exécution sans avoir accès au mot-clé dynamique.

Références:
Dynamically adding members to a dynamic object
http://tomlev2.wordpress.com/2009/10/08/c-4-0-implementing-a-custom-dynamic-object/

Répondre

2

Vous devrez créer un classeur personnalisé et vous voudrez probablement alors consommer le liant à l'aide d'un callsite afin que les actions sont mises en cache.

Vous pouvez utiliser le DefaultBinder dans la couche externe pour faire la plupart de ceci - vous avez juste besoin de créer un, puis il a des méthodes comme GetMember dessus pour faire la liaison. L'implémentation de votre classeur n'utilise alors que DefaultBinder et applique des règles pour les types de valeurs de boxe qui reviennent (le DLR exige que tous les types de retour soient des objets).

+0

Voilà ma pensée actuelle était bien. J'espère qu'il y a un mouvement ninja secret qui me manque donc je n'ai pas besoin d'écrire un classeur personnalisé et un callsite étant donné ce type de comportement est disponible dans .NET 4.0. – Firestrand