2012-10-19 60 views
6

我們正在做很多INotifyPropertyChanged的執行在我們的視圖模型很坦率地說越來越厭倦了火屬性的變化事件明確兩者的不便和美觀的原因。在我們的代碼添加一個擴展方法爲屬性存取

我想提出一個擴展我們的setter方法,使產生的代碼的樣子:

public string LazyAccessor 
{ 
    get; 
    set.notify(); 
} 

有沒有辦法做到這一點?如果沒有,我們可以發明一個嗎?

回答

3

Extension methods只能添加到類型。自動屬性上的getters和setter被編譯器轉換成方法帶有後備變量,因此無法在其上放置擴展方法。

2

有沒有辦法做到這一點?

沒有,沒有,不喜歡你的帳。擴展方法在類型上運行,而不是獲取者或設置者。

我們可以發明之一,如果有沒有?

這將需要對C#規範進行更改 - 不是可能發生的事情。

還有,你可以採取的緩解這種其他的方法 - 使用基類的方法,這將使鍋爐板呼喚你的例子。

+0

另一個有趣的方法。你能看看我的回答,看看這是否可行嗎?我尊重你的意見,因爲你的聲譽在你之前。也許它太重了? –

0

他們沒有把它變成4.0,但據傳被列入5.0。

我發現this方法很有幫助。

4

結賬NotifyPropertyWeaver。這將在構建過程中修改您的代碼,以使您的屬性實現INotifyPropertyChanged模式。

這是作爲一個Visual Studio Extension

+0

我認爲這是AOP的前身,像PostSharp之類的東西,或者他們不知道PostSharp存在? –

+0

@BigM我不確定任何工作的細節。我知道他們都使用IL Weaving,所以它們在概念上是相似的。我使用NotifyPropertyWeaver的原因是你不需要用屬性混淆你的代碼。 – cadrell0

+0

使用該解決方案的好理由。 PostSharp是***非常通用的,這適合解決**一個**痛點,它肯定會更簡潔! –

0

你不能這樣做,所設定的本身。這是一個行動。然而,你也許可以做到這一點:

public static class extensions() 
{ 
    public static NotifyAccessorSet(this string value) { some code } 
} 

public class SomeClass() 
{ 
    ..... 
    private string mAccessor; 

    public string LazyAccessor{ 
    get { return mAccessor; } 
    set { mAccessor = value; mAccessor.NotifyAccessorSet(); } 
    } 

} 

這有點把我的頭頂部,記住,擴展方法將適用於所有類型的字符串,所以你可能想實現自己的返回類型和應用它的擴展方法。然後從lazyaccessor返回該類型。

+0

我不知道,但我認爲要觸發NotifyPropertyEvent你需要知道原始對象(發件人)和屬性名稱(本例中的「LazyAccessor」)。所以你的代碼會讓它變得更加健談。 – Ondra

+0

您將擁有原始對象...它將是NotifyAccessorSet函數中的「值」。無論如何......只是一個建議。這種方法會實現一個額外的函數調用,這只是提供了一種在set方法中實現通知的方法。 – DRobertE

0

您可以通過覆蓋自定義泛型結構的轉換運算符而不調用事件manualy來模擬「類似財產」的行爲。 以下是我的解決方案:

public struct column<TType> 
{ 
    private TType _value; 

    private column(TType value) : this() 
    { 
     _value = value; 
    } 

    private void Set(TType value) 
    { 
     // Implement your custom set-behavior... 
    } 

    private TType Get() 
    { 
     // Implement your custom get-behavior... 
     return _value; 
    } 

    public override string ToString() 
    { 
     return _value.ToString(); 
    } 

    public static implicit operator column<TType>(TType p) 
    { 
     column<TType> column = new column<TType>(p); 
     column.Set(p); 
     return column; 
    } 

    public static implicit operator TType(column<TType> p) 
    { 
     return p.Get(); 
    } 
} 

我宣佈結構與通用參數,以避免轉換錯誤。您可以使用它像這樣:

public class Test 
{ 
    public column<int> kKey; 

    public column<float> dMoney; 

    public column<string> cValue; 


    public Test() 
    { 
     kKey = 42; 
     dMoney = 3.1415926f; 
     cValue = "May the force be with you!"; 
    } 
} 

...我知道,這個問題已經過時,但它可以幫助別人的未來。

相關問題