Domanda

Utilizzando DynamicProxy 2.2 penso che sto vedendo questo problema:

  

"attributi ereditabili sulle proprietà virtuali non disponibili sul proxy"

http://support.castleproject.org/projects / DYNPROXY / temi / view / DYNPROXY-problema-109

Ho una classe base con una proprietà virtuale. La proprietà è contrassegnato con [XmlIgnore]. Se ho serializzare una classe derivata, la proprietà non viene serializzato. Ma se creo un proxy per la classe derivata, la proprietà viene serializzato. Ecco una semplice applicazione console che mostra il problema:

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; }
    }
}

Si tratta di un bug? O sto facendo qualcosa di sbagliato. soluzione rapida è quella di rendere la mia proprietà IsDirty non virtuali. Che può effettivamente essere accettabile nello scenario con cui sto lavorando, ma preferisco che sia virtuale.

Grazie.


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

È stato utile?

Soluzione

OK, ecco quello che penso sta accadendo.

Il problema è che la classe derivata non sostituisce la proprietà IsDirtry, mentre il proxy fa.

L'attributo XmlIgnore è ereditabile così DP non replica, però sto cercando di indovinare il serializzatore non si preoccupa a questo proposito, e si presuppone che da quando l'attributo non è stato replicato che dovrebbe andare avanti e serializzare la proprietà.

Altri suggerimenti

Volevo solo aggiungere qualcosa a questo che ho trovato oggi. Potrei anche usare un gancio di generazione del proxy per saltare il proxy di questa particolare struttura:

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;
    }
}

Quindi basta usare questo gancio durante la creazione del generatore di proxy:

var generator = new ProxyGenerator();
var options = new ProxyGenerationOptions(new SkipIsDirtyProxying());
var derivedProxy = generator.CreateClassProxy<Derived>(options);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top