2010-04-25 72 views
10

我正在編寫將填充System.Windows.Documents名稱空間中的類的MarginPaddingBorderThickness屬性的代碼。每個屬性都接受一個結構爲System.Windows.Thickness的值。是否有一個實用的替代結構繼承? (C#)

但是,我希望將一些額外的數據與這些屬性分配中的每一個相關聯,這些分配隨後可以通過我的代碼進行檢索。如果Thickness是一個類,我會從它繼承並定義子類中的屬性來存儲我的其他數據項。但由於它是一個結構,所以繼承是不可能的。

是否有任何實際的方法來實現這一點,同時保持與我正在填充的屬性的類型兼容性?

感謝您的想法,

回答

9

沒有替代品。

取決於你正在嘗試做的,你也許可以用你需要的屬性定義自己的類,並定義了隱式轉換操作符做一個隱式轉換爲正確的結構類型。然後,您將能夠將您的課程傳遞給期望厚度參數的所有方法。

這將違背使用隱式轉換操作符,雖然的建議,因爲它指出了隱式轉換不會丟失任何信息。您將無法從您正在閱讀的媒體資源中獲取厚度,並查看您附加的額外信息。

這是你如何可以實現它:

public class ThicknessEx 
{ 
    public string ExtraData { get; set; } 
    public Thickness Thickness { get; set; } 

    public static implicit operator Thickness(ThicknessEx rhs) 
    { 
     return rhs.Thickness; 
    } 
} 

然而,你可能通過存儲額外的數據在其他地方更好。如何做到這一點取決於你的需求和應用。

+0

謝謝你的創新解決方案。正如你所說,它幾乎可行,但由於額外的數據不能從它被分配到的屬性中檢索到,這意味着它必須在其他地方重複,這有點自欺欺人。我試着調整你的想法與底層的依賴屬性工作,通過的SetValue()方法,但的SetValue()進行類型檢查,這似乎是一個障礙,在通過任何除了預期的類型。 – 2010-04-25 12:00:37

0

難道你不能存儲一個字典,其中的密鑰是結構的哈希碼?

+2

這取決於兩個相等的厚度實例是否需要在額外數據中具有相同的值。 – driis 2010-04-25 11:18:43

+0

嗯,好點。 – AndrewVos 2010-04-25 11:45:43

1

您可能可以使用AugmentedThickness類型的Attached Dependency Properties,然後在更改時更新它們要更新的基礎屬性。這要求使用附加屬性執行所有訪問,只需設置Thickness屬性不會使用AugmentedThickness。如果必要的話,你也可以(雖然它可能會有點邪惡)監聽明確的變化厚度特性(即你沒有啓動),並迫使它回到你的AugmentedThickness指定的值。