PropertyDescriptor и атрибуты
Я унаследовал PropertyDescriptor
класс для предоставления своего рода "динамических" свойств. Я добавляю некоторые атрибуты в PropertyDescriptor. Это работает отлично.
При отображении объекта в PropertyGrid
, ReadOnlyAttribute
работает, но EditorAttribute
не работает!
internal class ParameterDescriptor: PropertyDescriptor {
//...
public ParameterDescriptor(/* ... */) {
List<Attribute> a = new List<Attribute>();
string editor = "System.ComponentModel.Design.MultilineStringEditor,System.Design";
//...
a.Add(new ReadOnlyAttribute(true)); // works
a.Add(new DescriptionAttribute("text")); // works
a.Add(new EditorAttribute(editor, typeof(UITypeEditor))); // doesn't work!
//...
this.AttributeArray = a.ToArray();
}
}
Отображаемый объект использует унаследованный TypeConverter
:
public class ParameterBoxTypeConverter: TypeConverter {
public override bool GetPropertiesSupported(ITypeDescriptorContext context) {
return true;
}
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) {
List<PropertyDescriptor> desc = new List<PropertyDescriptor>();
//...
ParameterDescriptor d = new ParameterDescriptor(/* ... */);
desc.Add(d);
//....
return new PropertyDescriptorCollection(desc.ToArray());
}
Я застрял, потому что PropertyGrid
просто ничего не показывает (я ожидал "..." в значении свойства). И, похоже, нет возможности отладки!
Так как я могу найти, что здесь не так?
Есть ли способ отладки в PropertyGrid и т. Д.?
1 ответ
Из нескольких быстрых тестов, имя должно быть точно квалифицированным:
const string name = "System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";
attribs.Add(new EditorAttribute(name, typeof(UITypeEditor)));
Внутренне он использует Type.GetType
, а также:
var type1 = Type.GetType("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
// ^^^ not null
var type2 = Type.GetType("System.ComponentModel.Design.MultilineStringEditor, System.Design");
// ^^^ null
Конечно, вы можете просто использовать:
attribs.Add(new EditorAttribute(typeof(MultilineStringEditor), typeof(UITypeEditor)));
Кроме того, вы можете override GetEditor
и делай что хочешь.