2010-08-04 22 views
1

aide DynamicProxy 2.2 Je pense que je vois cette question:Le proxy n'obtient pas d'attributs sur les propriétés virtuelles?

"attributs héritables sur les propriétés virtuelles non disponibles sur proxy"

http://support.castleproject.org/projects/DYNPROXY/issues/view/DYNPROXY-ISSUE-109

J'ai une classe de base avec une propriété virtuelle. La propriété est marquée avec [XmlIgnore]. Si je sérialise une classe dérivée, la propriété n'est pas sérialisée. Mais si je crée un proxy pour la classe dérivée, la propriété EST sérialisée. Voici une application de console simple montrant le problème:

using System; 
using System.Xml.Serialization; 
using Castle.DynamicProxy; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var derived = new Derived { IsDirty = true, Sample = "ABC"}; 
      derived.Save(); 
      Console.WriteLine("\n\nProxied...\n"); 

      var generator = new ProxyGenerator(); 
      var derivedProxy = generator.CreateClassProxy<Derived>(); 
      derivedProxy.IsDirty = true; 
      derivedProxy.Sample = "ABC"; 
      derivedProxy.Save(); 

      Console.WriteLine("\n\n"); 
      Console.ReadKey(); 
     } 
    } 

    public abstract class Base 
    { 
     [XmlIgnore] 
     public virtual bool IsDirty { get; set; } 

     public virtual void Save() 
     { 
      var ser = new XmlSerializer(this.GetType()); 
      ser.Serialize(Console.Out, this); 
     } 
    } 

    public class Derived : Base 
    { 
     public virtual string Sample { get; set; } 
    } 
} 

Est-ce un bug? Ou est-ce que je fais quelque chose de mal? Une solution de contournement rapide consiste à rendre ma propriété IsDirty non virtuelle. Cela peut être acceptable dans le scénario avec lequel je travaille, mais je préférerais que ce soit virtuel.

Merci.


Patrick Steele http://weblogs.asp.net/psteele

+0

Est-ce un attribut héritables? 'XmlIgnore' ... –

Répondre

2

OK, voici ce que je pense qui se passe.

Le problème est que votre classe dérivée ne remplace pas la propriété IsDirtry, contrairement au proxy. L'attribut XmlIgnore est héritable, donc DP ne le réplique pas, mais je suppose que le sérialiseur ne s'en soucie pas, et suppose que puisque l'attribut n'a pas été répliqué, il devrait aller de l'avant et sérialiser la propriété.

+0

Yup! C'était exactement ça. Merci Krzysztof. Si je remplace la propriété dans ma classe Derived, je vois le même comportement que DP. – PatrickSteele

1

Je voulais juste ajouter quelque chose à ce que j'ai trouvé aujourd'hui. Je pourrais aussi utiliser un crochet de génération de proxy pour sauter le mandatement de cette propriété particulière:

public class SkipIsDirtyProxying: IProxyGenerationHook 
{ 
    public void MethodsInspected() 
    { 
    } 

    public void NonVirtualMemberNotification(Type type, System.Reflection.MemberInfo memberInfo) 
    { 
    } 

    public bool ShouldInterceptMethod(Type type, System.Reflection.MethodInfo methodInfo) 
    { 
     if (methodInfo.Name == "set_IsDirty" || methodInfo.Name == "get_IsDirty") 
     { 
      return false; 
     } 
     return true; 
    } 
} 

Ensuite, il suffit d'utiliser ce crochet lors de la création du générateur proxy:

var generator = new ProxyGenerator(); 
var options = new ProxyGenerationOptions(new SkipIsDirtyProxying()); 
var derivedProxy = generator.CreateClassProxy<Derived>(options);