2008-10-29 106 views
2

我們有我們使用的一些MVC-like系統,其中,在後代每個屬性是這樣寫的基本對象:PostSharp方面,調用泛型方法

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

這是用於調試完成兩目的以及通知和驗證目的。我們使用getter來告訴我們哪些代碼已經明確地標記了它將要讀取的內容(爲了讓基類只能在這些屬性改變時才能調用它)並且弄錯了,我們使用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; 
    } 
} 

編輯:發佈PostSharp forum爲好。

回答

2

它應該很簡單。您重寫OnEntry並根據您自己的代碼設置返回值。最後你用:

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

這將有效地攔截原來的Get/Set調用。

請參閱this blog,它顯示了使用相同模式的高速緩存方面...