C# - 类的默认值

时间:2011-08-10 13:16:52

标签: c# .net

    class StyleProperty<T>
{

   static readonly StyleProperty<Object> INHERIT ;

    T value;

    public T Value
    {
        get { return this.value; }
        set { this.value = value; }
    }

}

您好..
当不应该使用值时,上面的类有时应该具有值INHERIT c#不允许重载属性我不能设置Value = StyleProperty.Inherit。我必须是T型。

知道该怎么做吗?

2 个答案:

答案 0 :(得分:0)

不完全确定您要求的是什么,但您可以为此属性定义默认值:

[DefaultValue(<Value>)]
public T Value
{
    get { return this.value; }
    set { this.value = value; }
}

答案 1 :(得分:0)

阅读完您的评论后,请注意以下几点:

class StyleProperty<T>
{
    T _Value;

    public StyleProperty(T inheritedValue)
    {
        _Value = inheritedValue;
    }

    public T Value
    {
        get { return this._Value; }
        set { this._Value = value; }
    }        
}

您的第一个问题是继承的值应该如何流入具体实例?我能想到的唯一方法就是构造函数。如果用户不喜欢这个值,他可以简单地改变它(可能是相同的值)。

如果你要用于继承某种全局变量(但那不是继承,那将是一个默认值)你也可以考虑使用一个布尔标志,它将在getter中检查以查明是否应使用后备存储或默认值,它将始终设置为设置器中其初始状态的反面。

class StyleProperty<T>
{
    T _Value;
    bool _UseBackingStore;

    public T Value
    {
        get { return _UseBackingStore ? this._Value : INHERIT; }
        set { this._Value = value; _UseBackingStore = true; }
    }        
}

更新

为了在您的应用程序中获得皮肤支持,我认为您需要采取不同的方法。您正在使用的所有表单和gui控件都应该实现某种接口(例如ISkin)。您的应用程序也应该有某种SkinSelector。这个包含有关着色,字体等的所有信息,它还获得对MainForm的引用。在构造函数中,它以递归方式运行表单的Controls属性,并检查是否有任何控件实现您的界面(只需使用as ISkin并检查null)。如果它是可换肤的,只需设置控件的颜色,字体等,如SkinSelector中所定义。听起来很简单但问题是,你必须派生所有gui控件并添加你的界面。所以这不是一件复杂的事情,但可能还有很多工作要做。也许您可以测试Generics是否可以使用SkinWrapper<T> where T : ControlISkin ToSkinnableControl(this Control control)等扩展函数来帮助您。但这只有在您需要更改一些常见属性时才有效,这些属性对于所有控件都是相同的。如果您需要更多皮肤控制,例如对于DataGridView或ComboBox,我认为派生是帮助你的唯一方法。