如何在c#中的属性属性中访问类变量?

时间:2012-09-04 04:33:05

标签: c# propertygrid

我为我的properygrid定义了一个属性,它的值是创建者的集合。我定义了 CreatorsEditor 类。在本课程中,我使用 HumanRolesCode 变量。如何在属性的属性中访问此变量以获取设置值。我想要更改 HumanRolesCode 值。例如: [Editor(typeof(CreatorsEditor(HumanRolesCode = 10))]

我的代码是:

[Editor(typeof(CreatorsEditor), typeof(UITypeEditor))]
public string Creators { get; set; }
//-------------------------------------

public class CreatorsEditor : UITypeEditor
{
    public static int HumanRolesCode;

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService svc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
        if (svc != null)
        {
            CreatorFrm.HumanRoleCode = HumanRolesCode;
            CreatorFrm Frm = new CreatorFrm();
            if (svc.ShowDialog(Frm) == System.Windows.Forms.DialogResult.OK)
            {
                string HumanNames = "";
                for (int i = 0; i < Frm.DgvCreator.Rows.Count; i++)
                    if (Boolean.Parse(Frm.DgvCreator[0, i].Value.ToString()) == true)
                        HumanNames += Frm.DgvCreator[2, i].Value.ToString() + " , ";
                if (!string.IsNullOrEmpty(HumanNames))
                    HumanNames = HumanNames.Substring(0, HumanNames.Length - 3);
                return HumanNames;
            }
        }
        return value;
    }
}

1 个答案:

答案 0 :(得分:2)

属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式。

似乎无法分配一些值,并且通常会通过自定义属性的声明来执行一些运行时代码(method \ property)。

自定义属性只是将附加信息与目标相关联的一种方式,编译器只是将其他信息添加到元数据中...当您希望在编译时更改时,该变量仅在运行时存在。

此外,在您使用反射来检索它之前,不会创建自定义属性的实例(再次 - 在运行时,声明是在编译时)。

Jeffrey Richter的书“CLR via C#”中有一章关于自定义属性。我建议您阅读它以了解自定义属性的行为方式,使用它们可以做什么以及如何使用它们。