4

我为我的属性网格定义了一个属性,它的值是创建者的集合。我定义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;
    }
}
4

1 回答 1

2

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

好像不能赋值一些,一般通过自定义属性的声明来让一些运行时代码(方法\属性)去执行。

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

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

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

于 2012-09-04T05:44:33.447 回答