C#-类的默认值 类样式属性 { 静态只读样式属性继承; T值; 公共价值 { 获取{返回this.value;} 设置{this.value=value;} } }

C#-类的默认值 类样式属性 { 静态只读样式属性继承; T值; 公共价值 { 获取{返回this.value;} 设置{this.value=value;} } },c#,.net,C#,.net,你好.. 当不应使用值时,上述类有时应具有值继承。。作为 c#不允许重载属性,我无法设置Value=StyleProperty.Inherit。我一定是T型的 知道该怎么做吗?不太清楚您要的是什么,但您可以为如下属性定义默认值: class StyleProperty<T> { static readonly StyleProperty<Object> INHERIT ; T value; public T Value {

你好..
当不应使用值时,上述类有时应具有值继承。。作为 c#不允许重载属性,我无法设置Value=StyleProperty.Inherit。我一定是T型的


知道该怎么做吗?

不太清楚您要的是什么,但您可以为如下属性定义默认值:

    class StyleProperty<T>
{

   static readonly StyleProperty<Object> INHERIT ;

    T value;

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

}
[DefaultValue()]
公共价值
{
获取{返回this.value;}
设置{this.value=value;}
}

阅读您的评论后,您会怎么看:

[DefaultValue(<Value>)]
public T Value
{
    get { return this.value; }
    set { this.value = value; }
}
类样式属性
{
T_值;
公共样式属性(T inheritedValue)
{
_值=继承值;
}
公共价值
{
获取{返回此值。_值;}
设置{this.\u Value=Value;}
}        
}
第一个问题是继承的值应该如何流入具体实例?我能想到的唯一方法就是构造函数。如果用户不喜欢这个值,他可以简单地更改它(可能是相同的值)

如果您要为继承使用某种全局变量(但这不是继承,而是默认值)您还可以考虑使用一个布尔标志,该标志将在getter中检查,以确定是否应该使用backing store或default,并且在setter中它将始终设置为与其初始状态相反的状态

class StyleProperty<T>
{
    T _Value;

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

    public T Value
    {
        get { return this._Value; }
        set { this._Value = value; }
    }        
}
类样式属性
{
T_值;
bool_UseBackingStore;
公共价值
{
获取{return}UseBackingStore?this.\u值:INHERIT;}
设置{this.\u Value=Value;\u UseBackingStore=true;}
}        
}
更新
要在应用程序中获得皮肤支持,我认为您需要采取不同的方法。您使用的所有表单和gui控件都应该实现某种类型的界面(例如,
ISkin
)。此外,您的应用程序应该具有某种类型的
SkinSelector
。这一个包含关于颜色、字体等的所有信息,并且它还获得了对主窗体的引用。在构造函数中,它递归地运行表单的Controls属性,并检查是否有任何控件实现您的接口(只需使用
作为ISkin
并检查
null
)。如果它是可蒙皮的,只需按照
SkinSelector
中的定义设置控件的颜色、字体等即可。听起来很容易,但问题是,您必须派生所有gui控件,并向它们添加界面。所以这不是一件复杂的事情,但可能需要做很多工作。也许您可以通过使用
SkinWrapper(其中T:Control
和类似
ISkin-ToSkinnableControl(此控件)
)的扩展函数来测试泛型是否可以帮助您。但是,只有当您需要更改一些公共属性时,这才起作用,这些属性对于所有控件都是相同的。如果您需要更多的皮肤控制,例如DataGridView或ComboBox,我认为衍生工具是唯一可以帮助您解决问题的方法。

我恐怕真的不清楚您的意思。您认为它应该具有继承值是什么意思?INHERIT是一个字段,有一个空值……我认为如果T为空,他希望返回INHERIT的值。某种类型的泛型约束可以实现我认为的技巧。
INHERIT
没有值,它没有实例化。像css一样思考。如果它的value=inherit,那么它将查看该类之外的StyleProperty类型的另一个对象(如堆栈)。。问题是如果我有StyleProperty styleProp。。。。那么值将是int。。所以没有办法告诉value=Inherit,除非stylePross等于“表示”Inherit的对象。
T
的默认值不正确吗?第二种方法就是我使用的方法。。第一种方法的问题是继承的值可能会改变,这是一个问题。。我所要做的就是为我的应用程序提供皮肤支持,而简单的属性不起作用:(我在.net中实现了一些类似依赖属性的东西,因为它们在我的平台中不可用。
class StyleProperty<T>
{
    T _Value;
    bool _UseBackingStore;

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