2011-11-11 2 views
2

J'ai un objet remis dans notre bibliothèque et passé par différents processus. J'ai besoin de joindre des informations supplémentaires à ces objets lorsqu'ils traversent différentes étapes et sortent de l'autre extrémité - une sorte de modèle de décorateur dynamique, je suppose, sauf ajouter des propriétés supplémentaires plutôt que de modifier le comportement existant. J'espérais utiliser LinFu ou Castle pour créer un proxy dynamique et implémenter une interface supplémentaire sur l'objet pour le stocker. Les composants qui connaissent l'interface étendue peuvent lancer et accéder à celle-ci - tandis que ceux qui ne le sont pas sont inconscients, car le type sous-jacent n'a pas changé.Dactylographie de canards/proxies dynamiques sur des instances existantes d'objets

Cependant, je n'avais pas apprécié que tous ces mécanismes supposent que vous avez le contrôle sur le point où le type est initialement créé - ce que je ne fais pas.

Est-ce que quelqu'un a des suggestions sur la façon dont je pourrais mieux aborder cela?

Un grand merci

Répondre

-1

Cela ne répond pas exactement votre scénario mais que diriez-vous à l'aide d'une mise en œuvre DynamicObject qui agit comme un décorateur autour de votre objet? Cela vous permettrait d'accéder à l'objet original ainsi qu'à d'autres propriétés. Un peu comme ExpandoObject mais commençant par vos propres données d'instance.

Quelque chose comme ceci:

public class Expando : DynamicObject 
{ 
    public dynamic Instance; 
    Dictionary<string, dynamic> ExtraProperties = new Dictionary<string, dynamic>(); 

    public Expando(object instance) 
    { 
     Instance = instance; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     try 
     { 
      result = ReflectionUtils.GetProperty(Instance, binder.Name); 
      return true; 
     } 
     catch 
     { 
      if (ExtraProperties.Keys.Contains(binder.Name)) 
      { 
       result = ExtraProperties[binder.Name]; 
       return true; 
      } 
     } 

     result = null; 
     return false; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     try 
     { 
      ReflectionUtils.SetProperty(Instance, binder.Name, value); 
     } 
     catch (Exception ex) 
     { 
      ExtraProperties[binder.Name] = value; 
     } 

     return true; 
    } 

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
    { 
     try 
     { 
      result = ReflectionUtils.CallMethod(Instance, binder.Name, args); 
      return true; 
     } 
     catch 
     {} 

     result = null; 
     return false; 
    } 
} 

Il ne traite pas ne va pas votre exigence forte frappe/interface malheureusement bien et les performances à la plus grande donnée ici l'utilisation de la réflexion (de http://www.west-wind.com:8080/svn/WestwindWebToolkit/trunk/Westwind.Utilities/Utilities/ReflectionUtils.cs)

0

On dirait que l'overkill ... il suffit de créer une nouvelle classe contenant juste vos propriétés "extra". Le définir un statique Dictionary<MainClass,ExtensionsClass>. Lorsque vos composants "in the know" veulent voir les propriétés étendues d'un objet, ils regardent simplement cet objet dans le dictionnaire.

Questions connexes