Передача типов с интерфейсом в параметры метода расширения C#

98
09 июня 2021, 05:50

Долго бился над этим вопросом, штудируя литературу и неистово насилуя гугл, но так и не нашел решения, может кто здесь подскажет.

Начну с самого начала. У меня есть три класса, которые реализуют свойства одного и того же интерфейса:

interface IStandartUnit
{
    int ID { get; set; }
    string Name { get; set; }
}

Классы приводить не буду полностью (много конфиденциальной информации, да и не нужна она здесь):

public class UnitDepartment : IStandartUnit //подразделения
public class UnitFilial : IStandartUnit //филиалы
public class UnitPerson : IStandartUnit //сотрудники

Для отображения списка по каждому из классов использую CheckedListBox (почему? - лирика, к делу не особо относящаяся.). В процессе выполнения возникла необходимость в создании метода расширения для CheckedListBox дабы по переданному ID вычислять индекс элемента в списке. Например, вот так:

public static class ListBoxExtension
{
    public static int GetUnitIndexById(this CheckedListBox clb, int _id)
    {
        int i = 0;
        foreach(UnitFilial uf in clb.Items)
        {
            if (uf.ID == _id)
            {
                break;
            }
            i++;
        }
        return i;
    }
}

Вообще, в результате должно получиться следующее: я передаю ID и bool-состояние в метод расширения для CheckedListBox и метод меняет свойство Checked у элемента списка на переданное. Но я решил начать с простого подхода, просто ища индекс. Сложность вот в чем: мне необходим универсальный метод расширения для списков всех трех классов. Кто еще не понял - я использую классы добавляя их экземпляры в CheckedListBox (ToString() прописан в каждом классе, не волнуйтесь =Р). Не смешивая. Один список - один класс.

Итоговый вопрос. Могу ли я каким то образом реализовать нечто вроде этого чтобы оно работало:

public static class ListBoxExtension
{
    public static void SetUnitState(this CheckedListBox clb, int _id, bool _state)
    {
        int i = 0;
        foreach(IStandartUnit su in clb.Items)
        {
            if(su.ID == _id)
            {
                break;
            }
            i++;    
        }
        clb.SetItemChecked(i, _state);
    }
} 

Буду рад любым советам, касающимся дела. Спасибо.

UPD: Прошу прощения за то что отнял ваше время. Код работает как должен. Это я просто тупенький. Надеюсь, что инфа в вопросе не будет бесполезной, авось кому-то да пригодится.

Answer 1

Оно так и работает:

public static class ListBoxExtension
{
    public static void SetUnitState(this CheckedListBox clb, int _id, bool _state)
    {
        int i = 0;
        foreach(IStandartUnit su in clb.Items)
        {
            if(su.ID == _id)
            {
                break;
            }
            i++;    
        }
        clb.SetItemChecked(i, _state);
    }
} 
READ ALSO
Ошибки работы VisualStudio с репозиторием

Ошибки работы VisualStudio с репозиторием

Помогите разобраться с проблемойПосле синхронизации репозитория с azure devops, у меня с двумя формами в проекте возникает проблема

86
Массовое сравнение таблиц MySql и удаление строк

Массовое сравнение таблиц MySql и удаление строк

В базе есть таблица "Users", в ней есть колонка user_id (числовое значение) Любой юзер может создать объявление(строку) в таблице "obj", которому будет...

80
Как решить проблему с древовидной структурой?

Как решить проблему с древовидной структурой?

Всем привет мне надо сделать древовидную структуру!

114
Как сделать ссылку с сегодняшней датой?

Как сделать ссылку с сегодняшней датой?

Делаю ссылки в ввиде http://siteru/main

110