Вы уже создаете коллекцию, подобную этой:
PropertyDescriptorCollection propsCollection =
new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray());
Но коллекция, которую вы создаете, имеет только существующие свойства, но не новые свойства.
Вам необходимо предоставить однумассив, объединенный из существующих свойств и ваших новых свойств.
Примерно так:
instanceProps.Cast<PropertyDescriptor>().Concat(customProperties).ToArray()
Следующая проблема: вам нужен customProperties
, который является набором PropertyDescriptor
.К сожалению, PropertyDescriptor
является абстрактным классом, поэтому у вас нет простого способа его создания.
Однако мы можем это исправить, просто определив свой собственный класс CustomPropertyDescriptor
, унаследовав от PropertyDescriptor
и реализовав всеабстрактные методы.
Примерно так:
public class CustomPropertyDescriptor : PropertyDescriptor
{
private Type propertyType;
private Type componentType;
public CustomPropertyDescriptor(string propertyName, Type propertyType, Type componentType)
: base(propertyName, new Attribute[] { })
{
this.propertyType = propertyType;
this.componentType = componentType;
}
public override bool CanResetValue(object component) { return true; }
public override Type ComponentType { get { return componentType; } }
public override object GetValue(object component) { return 0; /* your code here to get a value */; }
public override bool IsReadOnly { get { return false; } }
public override Type PropertyType { get { return propertyType; } }
public override void ResetValue(object component) { SetValue(component, null); }
public override void SetValue(object component, object value) { /* your code here to set a value */; }
public override bool ShouldSerializeValue(object component) { return true; }
}
Я не заполнил вызовы для получения и установки ваших свойств;эти вызовы зависят от того, как вы реализовали динамические свойства внутри.
Затем вам нужно создать массив CustomPropertyDescriptor
, заполненный информацией, соответствующей вашим динамическим свойствам, и объединить ее с основными свойствами.как я описал вначале.
PropertyDescriptor
не только описывает ваших свойств, но также позволяет клиенту фактически получать и устанавливать значения этих свойств.И в этом весь смысл, не правда ли!