我为我的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;
}
}
答案 0 :(得分:2)
属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式。
似乎无法分配一些值,并且通常会通过自定义属性的声明来执行一些运行时代码(method \ property)。
自定义属性只是将附加信息与目标相关联的一种方式,编译器只是将其他信息添加到元数据中...当您希望在编译时更改时,该变量仅在运行时存在。
此外,在您使用反射来检索它之前,不会创建自定义属性的实例(再次 - 在运行时,声明是在编译时)。
Jeffrey Richter的书“CLR via C#”中有一章关于自定义属性。我建议您阅读它以了解自定义属性的行为方式,使用它们可以做什么以及如何使用它们。