Proxy non ottenere gli attributi sulle proprietà virtuali?
-
25-09-2019 - |
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
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);