Я хочу, чтобы PropertyInspector
позволял мне выбирать конкретный тип экземпляра для установки в свойстве абстрактного типа и расширяться до свойств этого типа, используя знак [+], как это обычно предоставляетсяExpandableObjectConverter
.
Однако кажется, что при использовании абстрактного типа в качестве свойства единственным выбираемым значением в списке является (null)
, и ничего не расширяется.Это я могу понять, поскольку у редактора нет возможности узнать, какие типы я хочу предоставить.
Но если я предоставлю свой собственный редактор с помощью EditorAttribute, который присваивает свойству конкретный экземпляр, производный от абстрактного типа, [+] - знак не появляется, и я не могу расшириться до вложенных свойств.
Я использовал несколько простых тестовых классов, таких как:
public abstract class Test
{
public string Name { get; set; }
}
public class TestImpl : Test
{
public string Description { get; set; }
}
public class MyObject
{
[TypeConverter(typeof(ExpandableObjectConverter))]
public Test MyTest { get; set; }
}
Как мне достичь того, что яхотите, чтобы свойство MyTest имело редактор, позволяющий мне выбрать конкретный тип, который я хочу, и когда я это сделаю, должен появиться знак [+], чтобы я мог установить свойства этого объекта?
Редактировать:
При использовании обычного PropertyGrid в Windows Forms следующий конвертер будет делать в точности то, что я хочу:
public class MyConverter : ExpandableObjectConverter
{
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
StandardValuesCollection coll = new StandardValuesCollection(new Test[] { new TestImpl() });
return coll;
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
return Activator.CreateInstance(Type.GetType((string)value));
}
}
Однако в конструкторе рабочих процессов(или PropertyInspector), кажется, не добавляет никакой функциональности (или, по крайней мере, не тот, который я хочу).На самом деле кажется, что никакие методы в конвертере даже не вызываются, что выглядит очень странно.
При изменении типа свойства MyObject.MyTest
на TestImpl
, ExpandableObjectConverter
работает.
(В действительности, конечно, было бы более одного класса, производного от абстрактного Test
)