2012-08-18 3 views
0

Возможно ли создать пользовательский атрибут (MyAttribute), чтобы во время выполнения get из Derived.MyProperty фактически вызывал Base.GetProperty («MyProperty») и набор Derived.MyProperty вызывает Base.SetProperty («MyProperty», значение).Использование декорированного атрибута для метода вызова метода базового класса

class Derived : Base 
{ 
    [MyAttribute] 
    string MyProperty { get; set;} 
} 

class Base 
{ 
    XmlDoc _xmldoc; 
    void SetProperty(string key, string value) 
    { 
    set key, value into _xmldoc; 
    } 
    string GetProperty(string key); 
    { 
    get key value from _xmldoc; 
    } 
} 

Вот решение, полученное из комментариев ниже. Спасибо всем комментаторам.

public class WatchAttribute : HandlerAttribute 
{ 
    public override ICallHandler CreateHandler(IUnityContainer container) 
    { 
    return new WatchHandler(); 
    } 
} 

public class WatchHandler : ICallHandler 
{ 
    public int Order { get; set; } 
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
    Console.WriteLine(string.Format("Method '{0}' on object '{1}' was invoked.", 
    return getNext()(input, getNext); 
    } 
} 

public class SomeAction : MarshalByRefObject 
{ 
    [Watch] 
    public string MyProperty1 { get; set; } 

    public string MyProperty { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    SomeAction c = new SomeAction(); 
    IUnityContainer container = new UnityContainer() 
     .AddNewExtension<Interception>(); 
    container.Configure<Interception>() 
     .SetInterceptorFor<SomeAction>(new TransparentProxyInterceptor()) 
     .AddPolicy("WatchAttribute Policy") 
     .AddMatchingRule(new PropertyMatchingRule("*", PropertyMatchingOption.GetOrSet)); 
    container.RegisterInstance<SomeAction>(c); 
    c = container.Resolve<SomeAction>(); 

    c.MyProperty1 = "Hello"; 
    c.MyProperty = "Hello"; 
    } 
} 
+0

Почему бы просто не реализовать их для этого? –

+0

Я пытаюсь упростить процесс разработки для пользователей Base. Base - это класс, который передается от узла к узлу в рабочем процессе и на каждом узле разработчик, который закодировал процессор на узле, может добавлять данные к принятому базовому объекту. Я пытаюсь скрыться от разработчика, добавленные свойства фактически содержатся в XML-документе, а также делают это естественным образом для разработчика. – user481779

+0

Этот вопрос может решить вашу проблему, если вы хорошо с IL ткачества [PostSharp аспекта для инкубационных свойств, вызывая общий метод] [1] [1]: http://stackoverflow.com/questions/246685/ postsharp-aspect-for-property-setters-call-generic-method –

ответ

1

использование единство перехвата будет лучше, потому что это позволит вам иметь прокси-сервер, завернуть вам метод, который вы хотите, и задать правило для фильтрации методы здесь, объяснения: http://www.lm-tech.it/Blog/post/2011/10/18/How-to-use-the-Unity-Interception-Extension.aspx это позволит вам сделать ваш процесс без установка любого атрибута, и ваш разработчик должен будет следовать только за именем правила (например, все свойства, которые работают с вашим xmldoc, имеют префикс Xml _...

+0

Большое спасибо. Единство позволило мне сделать то, что я описал выше. Это была комбинация TransparentProxyInterceptor, ICallHandler и PropertyMatchingRule, которые предоставили решение. Один из отрицательных заключается в том, что для того, чтобы свойства объекта «перехватывались», Unity создает объект с помощью метода Resolve. Я бы предпочел включить или выключить перехват на ранее созданном объекте - пока не понял этого. Еще раз спасибо. – user481779

+0

добро пожаловать ;-) –

Смежные вопросы