2008-10-29 8 views
2

Nous avons un objet de base que nous utilisons pour un système MVC-like, où chaque propriété dans un descendant est écrit comme ceci:aspect PostSharp pour setters de propriété, appelant la méthode générique

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

Cela se fait à la fois pour le débogage fins et à des fins de notification et de validation. Nous utilisons le getter pour nous alerter des cas où le code qui a explicitement marqué ce qu'il va lire (pour que la classe de base puisse l'appeler seulement quand ces propriétés changent) se trompe, et nous utilisons le setter pour les notifications de changement de propriété, la gestion drapeau sale, validation, etc.

pour simplifier, supposons que la mise en œuvre de ces méthodes ressemble à ceci:

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

Il y a plus de code dans ces deux bien sûr, mais ce code n'est pas pertinent à ma question, ou du moins je l'espère. Si c'est le cas, je vais modifier la question.

Quoi qu'il en soit, je voudrais écrire un aspect PostSharp qui implémente automatiquement les appels pour moi, sur les propriétés automatiques, comme ceci:

public String FirstName { get; set; } 

Est-ce qu'il ya quelqu'un qui a une idée comment j'irais à propos de faire ça?

J'ai créé moi-même des classes OnMethodBoundaryAspect, mais l'art d'appeler l'implémentation générique avec un paramètre ref ne m'échappe pas.

Voici les deux classes, je voudrais augmenter la classe TestObject pour appeler automatiquement la méthode correcte sur la propriété get et 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: Posté le PostSharp forum aussi bien.

Répondre

2

Cela devrait être très simple. Vous surchargez OnEntry et définissez la valeur de retour en fonction de votre propre code. À la fin vous utilisez:

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

qui interceptera efficacement les appels Get/Set d'origine.

Référez-vous à this blog qui montre l'aspect du cache en utilisant le même modèle ...

Questions connexes