C#属性访问

时间:2016-06-02 15:10:21

标签: c#

我正在编写一个程序,它根据数据库值在表单上生成许多自定义控件。该程序的一部分是将数据库中的唯一ID存储在自定义属性中。我使用它来访问和更改控件是否启用(基于验证)。我可以为属性赋值并从类中检索它们,但是当我尝试在不同的类中访问它时,我只是获取默认值。

属性类:

public class DCAttr : Attribute
{
    int _ControlID;
    ValidationType _ValidationType;

    public DCAttr()
    {
        _ControlID = 0; //Base value
        _ValidationType = ValidationType.NONE;
    }
    public int ControlID
    {
        get
        {
            return _ControlID;
        }
        set
        {
            _ControlID = value;
        }
    }

    public ValidationType ValidationType
    {
        get
        {
            return _ValidationType;
        }
        set
        {
            _ValidationType = value;
        }
    }
}

根据属性中存储的ID启用控件的功能:

public static void enablecontrolbyID(int ID)
{
    DataCapture2 form = (DataCapture2)Application.OpenForms[0]; //Thank the lord for 1 page applications :D
    foreach (Control cont in form.Controls)
    {
        DCAttr dcattr = (DCAttr)Attribute.GetCustomAttributes(cont.GetType())[0];
        if (dcattr.ControlID == ID)
        {
            cont.Enabled = true;
            break;
        }
    }
}

在上面指定的访问中,对于ValidationType,控制ID和ValidationType.None的返回值为0,但这些值在内部已经明确更改(使用断点进行确认,内部函数也在使用它并且工作正常)。

有什么想法吗?

编辑:为了清楚地在内部更新属性。 我使用属性附加到的类中的私有值来访问它们:

private DCAttr dcattr = (DCAttr)Attribute.GetCustomAttributes(typeof(DCGroupBoxRadio))[0]; // Reference to access Control ID

在初始化函数中,我有以下代码:

public DCGroupBoxRadio(int ID)
    {dcattr.ControlID = ID}

1 个答案:

答案 0 :(得分:0)

属性成员在编译时计算,不能在运行时更改。我想这是你想问的问题的答案。

EDIT1:

您可以更改属性成员,但是当您获取属性的新实例时,这些更改将不会保留,即使它来自相同的属性类型或装饰实例..这再次将我们带到上面提供的答案编辑。