1

我希望我的构造函数WebControl能够访问IsSpecial(来自 HTML)的值。然而,它总是false。我假设false在构造函数中,因为在构造函数方法结束之前它不会读取值。有没有办法让它知道IsSpecial构造函数中的正确值?

C#:

[DefaultProperty("Text")]
[ToolboxData("<{0}:WebControlExample runat=server></{0}:WebControlExample>")]
public class WebControlExample: WebControl, INamingContainer
{
    private readonly int[] goodies;

    public WebControlExample()
    {
        if (this.isSpecial)
        {
            goodies = new int[24];
        }
        else
        {
            //always reaches here
            goodies = new int[48];
        }
    }

    private bool isSpecial= false;
    public bool IsSpecial
    {
        set
        {
            this.isSpecial= value;
        }
    }
}

HTML:

<xyz:WebControlExamplerunat="server" id="webControlExample" IsSpecial="true" />
4

2 回答 2

1

在构造函数运行之前,在属性的标记中输入的值IsSpecial不会被分配给属性。想一想,.. 您期望的代码相当于以下内容:

WebControlExample webControlExample = null;
webControlExample.IsSpecial = true;
webControlExample = new WebControlExample();

实际发生的事情(简化!)是:

WebControlExample webControlExample = null;
webControlExample = new WebControlExample();
webControlExample.IsSpecial = true;

对于构造函数,没有办法影响这一点,无论如何,您可能不应该在 WebControl 的构造函数中做太多事情。

于 2015-04-01T14:43:39.350 回答
1

这不是一个很好的解决方案,但如果你必须有一个只读数组,你可以有两个只读数组并将它们包装在一个访问器中:

[DefaultProperty("Text")]
[ToolboxData("<{0}:WebControlExample runat=server></{0}:WebControlExample>")]
public class WebControlExample: WebControl, INamingContainer
{
    private readonly int[] goodies = new int[48];
    private readonly int[] goodiesSpecial = new int[24];

    private bool isSpecial= false;
    public bool IsSpecial
    {
        set
        {
            this.isSpecial= value;
        }
    }

    private int[] Goodies
    {
         get {return isSpecial ? goodiesSpecial : goodies;}
    }
}

但是您还没有说明 1. 为什么需要两个不同大小的数组或 2. 您在用它们做什么。

于 2015-04-01T16:30:28.873 回答