![](/img/trans.png)
[英]Customizing cache key using class properties for post sharp method caching
[英]Customizing Properties
我正在创建一些自定义控件,这些控件继承自具有以下属性的基本自定义控件:
public Color BorderColor
{
get { return BorderColor; }
set
{
if (!FollowsScheme)
BorderColor = value;
}
}
public Color[] FillColors
{
get { return FillColors; }
set
{
if (!FollowsScheme)
FillColors = value;
}
}
public bool FollowsScheme { get; set; }
我试图这样做,如果用户将FollowsScheme设置为false,那么他们才能编辑BorderColor和FillColors属性。 如果FollowsScheme为true,则他们无法编辑这两个属性。 在该代码中,您可以看到我尝试做的事情并且认为可行,但是当我构建解决方案并将控件添加到表单时,Visual Studio崩溃了。 我该怎么做?
让我解释一下,如果将FollowsScheme设置为true,则在OnPaint方法上代码将基于BorderColor和FillColors属性绘制控件,该属性基于填充了我设计的主题的颜色的静态类。 如果FollowsScheme设置为false,则OnPaint方法将采用BorderColor和FillColors属性并计算新方案并将这些颜色设置为列出的私有属性,然后将使用这些颜色绘制控件。
了解在向表单添加控件时,Visual Studio将运行呈现该控件所需的代码,以便可以在设计器中显示该控件。
您的代码抛出StackOverflowException
,随后导致Visual Studio崩溃。
引发此异常是因为属性setter是无限递归的。 解决方案是引入一个backng字段来保存这样的值:
private Color borderColor;
public Color BorderColor
{
get { return this.borderColor; }
set
{
if (!FollowsScheme)
this.borderColor = value;
}
}
您正在属性设置器中设置属性
public Color BorderColor
{
get { return BorderColor; }
set
{
if (!FollowsScheme)
BorderColor = value; // BOOM!
}
}
您需要为您的属性使用支持成员变量,通常如下所示:
private Color borderColor;
public Color BorderColor
{
get { return borderColor; }
set
{
if (!FollowsScheme)
borderColor = value;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.