2008-10-29 5 views
2

У нас есть базовый объект мы используем для некоторой MVC-подобной системы, где каждое свойство в потомке написано так:PostSharp аспект для инкубационных свойств, вызывая общий метод

public String FirstName 
{ 
    get { return GetProperty<String>("FirstName", ref _FirstName); } 
    set { SetProperty<String>("FirstName", ref _FirstName, value); } 
} 

Это делается как для отладки целях и целях уведомления и проверки. Мы используем геттер, чтобы предупредить нас о случаях, когда код, явно указывающий, что он будет читать (для того, чтобы базовый класс мог называть его только тогда, когда эти свойства меняются) и ошибочно, и мы используем setter для уведомлений собственности изменения, обработки грязно-флага, проверки и т.д.

для простоты предположим, что реализация этих методов выглядит следующим образом:

protected T GetProperty<T>(String propertyName, 
    ref T backingField) 
{ 
    return backingField; 
} 

protected Boolean SetProperty<T>(String propertyName, 
    ref T backingField, 
    T newValue) 
{ 
    backingField = newValue; 
    return true; 
} 

Там больше кода в обоих из них, конечно, но этот код не имеет отношения к моему вопросу, или, по крайней мере, я надеюсь на это. Если да, я изменю вопрос.

Во всяком случае, я хотел бы написать аспект PostSharp, который автоматически реализует вызовы для меня, автоматических свойств, например:

public String FirstName { get; set; } 

Есть ли кто-то там, что имеет некоторое представление о том, как я пошел бы об этом?

Я сам сделал классы OnMethodBoundaryAspect, но искусство вызова общей реализации с параметром ref ускользает от меня.

Вот два класса, я хотел бы увеличить класс TestObject, чтобы автоматически вызывать правильный метод для свойства get и set.

public class BaseObject 
{ 
    protected T GetProperty<T>(String propertyName, 
     ref T backingField) 
    { 
     return backingField; 
    } 

    protected Boolean SetProperty<T>(String propertyName, 
     ref T backingField, 
     T newValue) 
    { 
     backingField = newValue; 
    } 
} 

public class TestObject : BaseObject 
{ 
    public String FirstName 
    { 
     get; 
     set; 
    } 

    public String LastName 
    { 
     get; 
     set; 
    } 
} 

Edit: Опубликовано PostSharp forum а.

ответ

2

Это должно быть очень просто. Вы переопределяете OnEntry и устанавливаете возвращаемое значение на основе собственного кода. В конце вы используете:

eventArgs.ReturnValue = GetValue(x,y); 
eventArgs.FlowBehavior = FlowBehavior.Return; 

, который эффективно перехватит исходные вызовы Get/Set.

См. this blog, который показывает аспект кеша, используя тот же шаблон ...