2010-04-25 73 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指定的值。