Я думаю, что более важный вопрос - почему вы так много кастуете?
В первом примере:
Почему первый тип параметра IPlantItem
, если вы продолжаете приводить его к OSiteEquipment
? То же самое можно сказать и о втором параметре.
Во втором примере:
Почему GetParentPArtByObjectId возвращает IEnumerable<IPlantItem>
? Если бы он вернул ICollection<IPlantItem>
, вам не пришлось бы разыгрывать ObservableCollection<T>
. ObservableCollection<T>
наследуется от Collection<T>
, который реализует как ICollection<T>
, так и ICollection
. Вы должны иметь возможность удалить предмет из коллекции, даже не зная его типа.
Теперь несколько советов.
Не применяйте один и тот же объект несколько раз.
Не делай этого:
if (obj is IPlantItem)
((IPlantItem)obj).DoSomething();
Сделайте это вместо
IPlantItem plant = obj as IPlantItem;
if (plant != null)
plant.DoSomething();
Используйте базовые типы всякий раз, когда это возможно. Это избавит вас от необходимости кастовать так много. Как уже говорилось, не приводите к ObserableCollection<T>
для вызова метода на ICollection
Используйте дженерики. Если вам нужна специфичная для типа логика, создайте абстрактный базовый класс (или просто интерфейс, если вам не нужна общая логика) с универсальным параметром. Затем создайте реализации этого класса для каждой из реализаций интерфейса. Методы тоже могут быть общими. Я могу переписать второй пример как
public void DeletePart<TPlantItem>(TPlantItem plantItem)
where TPlantItem : IPlantItem
{
IEnumerable<TPlantItem> itmParent = GetParentPartByObjectId(_siteDocument, plantItem);
((ObservableCollection<TPlantItem>)itmParent).Remove(plantItem);
}