如果我将一个对象分配给PropertyGridControl.SelectedObjuect then I can use [PasswordPropertyTextAttribute(true)] for the password property并且效果很好。
但是我传递了一个实现ICustomTypeDescriptor的对象,如下所示,这没有效果:
AttributeCollection ICustomTypeDescriptor.GetAttributes()
{
AttributeCollection attrColl = TypeDescriptor.GetAttributes(this, true);
Attribute [] attrs = new Attribute[attrColl.Count + 1];
attrColl.CopyTo(attrs, 0);
attrs[attrs.Length-1] = new PasswordPropertyTextAttribute(true);
return new AttributeCollection(attrs);
}
有没有办法实现这个目标?我们正在使用Windows Forms& C#。
答案 0 :(得分:0)
事实是使用了不正确的方法来获得所需的结果。如ICustomTypeDescriptor.GetAttributes MSDN文章中所述,此方法返回此组件实例的自定义属性集合。 但是,要将属性分配给目标对象的属性,需要覆盖ICustomTypeDescriptor.GetProperties方法。在特定情况下,您可以按以下方式实施该方法:
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(this, attributes, true);
return UpdateProperties(props);
}
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(this, true);
return UpdateProperties(props);
}
private PropertyDescriptorCollection UpdateProperties(PropertyDescriptorCollection props)
{
List<PropertyDescriptor> newProps = new List<PropertyDescriptor>();
PropertyDescriptor current;
foreach (PropertyDescriptor prop in props)
{
current = prop;
if (prop.Name == "UserPassword")
current = TypeDescriptor.CreateProperty(typeof(UserInfo), prop, new Attribute[] { new PasswordPropertyTextAttribute(true) });
newProps.Add(current);
}
return new PropertyDescriptorCollection(newProps.ToArray()); ;
}