Ответ 1
Вы уже создаете такую коллекцию:
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
не только описывает ваши свойства, но также позволяет клиенту фактически получать и устанавливать значения этих свойств. И все дело в том, не так ли?