Прокси не получает атрибуты на виртуальных свойствах? - PullRequest
1 голос
/ 05 августа 2010

Использование DynamicProxy 2.2 Мне кажется, я вижу эту проблему:

"Наследуемые атрибуты для виртуальных свойств недоступны на прокси"

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

У меня есть базовый класс с виртуальным свойством.Свойство помечено [XmlIgnore].Если я сериализую производный класс, свойство не сериализуется.Но если я создаю прокси для производного класса, свойство сериализуется.Вот простое консольное приложение, показывающее проблему:

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

Это ошибка?Или я что-то не так делаю.Быстрый обходной путь - сделать мое свойство IsDirty не виртуальным.Это может быть приемлемо в сценарии, с которым я работаю, но я бы предпочел, чтобы он был виртуальным.

Спасибо.


Патрик Стил http://weblogs.asp.net/psteele

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Хорошо, вот что, я думаю, происходит.

Проблема в том, что ваш производный класс не переопределяет свойство IsDirtry, в то время как прокси-сервер делает.

Атрибут XmlIgnore является наследуемым, поэтому DP не реплицирует его, однако я предполагаю, что сериализатор не заботится об этом и предполагает, что, поскольку атрибут не был реплицирован, он должен продолжить и сериализовать свойство.

1 голос
/ 05 августа 2010

Просто хотел добавить кое-что к тому, что нашел сегодня. Я также мог бы использовать ловушку генерации прокси, чтобы пропустить прокси этого конкретного свойства:

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

Тогда просто используйте этот хук при создании прокси-генератора:

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