This question (вместе с его ответом) объясняет, почему вы не можете легко привязать DataGridView к типу интерфейса и получить столбцы для свойств, унаследованных от базового интерфейса.Привязка к интерфейсу и отображение свойств в базовом интерфейсе
Предлагаемое решение заключается в реализации пользовательского TypeConverter. Моя попытка ниже. Однако создание DataSource и DataGridView, привязанных к ICamel, по-прежнему приводит только к одному столбцу (Humps). Я не думаю, что мой конвертер используется .NET для определения свойств, которые он может видеть для ICamel. Что я делаю не так?
[TypeConverter(typeof(MyConverter))]
public interface IAnimal
{
string Name { get; set; }
int Legs { get; set; }
}
[TypeConverter(typeof(MyConverter))]
public interface ICamel : IAnimal
{
int Humps { get; set; }
}
public class MyConverter : TypeConverter
{
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
if(value is Type && (Type)value == typeof(ICamel))
{
List<PropertyDescriptor> propertyDescriptors = new List<PropertyDescriptor>();
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(typeof(ICamel)))
{
propertyDescriptors.Add(pd);
}
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(typeof(IAnimal)))
{
propertyDescriptors.Add(pd);
}
return new PropertyDescriptorCollection(propertyDescriptors.ToArray());
}
return base.GetProperties(context, value, attributes);
}
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}
}
Два других сообщения, которые могут вам понравиться: http://stackoverflow.com/questions/749542#750481 и http://stackoverflow.com/questions/882214#882246 –