Я немного новичок в интерфейсах C # и столкнулся с довольно неуклюжим решением проблемы расширения в списках наследуемых интерфейсов.Примеры интерфейсов выглядят так:
public interface IData
{
int Value { get; set; }
}
public interface IDataWithName : IData
{
string Name { get; set; }
}
public interface IDataContainer
{
IList<IData> DataList { get; set; }
}
public interface IDataWithNameContainer : IDataContainer
{
new IList<IDataWithName> DataList { get; set; }
}
С методом расширения:
public static class ExtensionMethod
{
public static int CountNumberOfIDataItems(this IDataContainer i)
{
return i.DataList.Count();
}
}
При реализации этих интерфейсов необходимо реализовать как IList DataList, так и IList IDataContainer.DataList.Хотя это возможно, полученный код неэлегатен:
public class DataNameImplimentatioFixed : IDataWithNameContainer
{
public IList<IDataWithName> DataList { get; set; }
IList<IData> IDataContainer.DataList
{
get => new List<IData>(DataList);
set
{
DataList = new List<IDataWithName>();
foreach (IDataWithName _dataLoop in value) { DataList.Add(_dataLoop); }
}
}
}
Дублирование списка каждый раз, когда вызывается расширение, может привести к некоторым проблемам с производительностью, а также к необходимости дополнительной проверки того, что любые дополнительные методы в IDataContainerне будет пытаться добавить классы, которые наследуются от IData, но не IDataWithName.
Такое ощущение, что должен быть лучший способ использования методов расширения, который не столь уязвим для проблем с будущими расширениями.Лучшее решение, которое я могу придумать, - это удалить IList DataList из IDataContainer и иметь отдельный метод расширения для каждого класса, который содержит список.
Может кто-нибудь придумать лучшее решение, чем это?