powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Dictionary. Добавление
14 сообщений из 14, страница 1 из 1
Dictionary. Добавление
    #39329975
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как добавить процессоры в Dictionary:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        private readonly Dictionary<ActionType, IProcessor<ActionData, Object>> _processors = new Dictionary<ActionType, IProcessor<ActionData, Object>>()
        {
            { ActionType.RegisterCard, new RegisterCardProcessor() },
            { ActionType.ChangeIncluded, new ChangeIncludedProcessor() },
            { ActionType.ExcludeCard, new ExcludeCardProcessor() },
            { ActionType.GetCard, new GetCardProcessor() },
            { ActionType.GetStateCard, new GetStateCardProcessor() },
            { ActionType.GetRightholderCards, new GetRightholderCardsProcessor() },
            { ActionType.GetNSIs, new GetNSIsProcessor() }
        };



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public interface IProcessor<T, TOut> where T : ActionData
    {
        TOut Process(IService serice, T data);
    }

    public class RegisterCardProcessor : IProcessor<RegisterCardActionData, ResponseData>
    {
        public ResponseData Process(IService serice, RegisterCardActionData data)
        {
            return serice.RegisterCard(data.CardData);
        }
    }
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330035
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы потом вызвать нужный вот таким способом:

Код: c#
1.
                        var proc = _processors[requestData.Action].Process(_service, requestData.RequestData);
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330047
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

RegisterCardProcessor
ChangeIncludedProcessor
ExcludeCardProcessor
GetCardProcessor
GetStateCardProcessor
GetRightholderCardsProcessor
GetNSIsProcessor

должны реализовывать интерфейс IProcessor<ActionData, Object>, а они его не реализовывают,
судя по RegisterCardProcessor,
который реализовывает совсем другой интерфейс IProcessor<RegisterCardActionData, ResponseData>
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330053
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

сделай отдельный интерфейс без шаблонов с единственным методом Process и зови его у объектов из словаря
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330057
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        private readonly Dictionary<ActionType, IProcessor> _processors = new Dictionary<ActionType, IProcessor>()
        {
            { ActionType.RegisterCard, new RegisterCardProcessor() },
            { ActionType.ChangeIncluded, new ChangeIncludedProcessor() },
            { ActionType.ExcludeCard, new ExcludeCardProcessor() },
            { ActionType.GetCard, new GetCardProcessor() },
            { ActionType.GetStateCard, new GetStateCardProcessor() },
            { ActionType.GetRightholderCards, new GetRightholderCardsProcessor() },
            { ActionType.GetNSIs, new GetNSIsProcessor() }
        };

    public interface IProcessor
    {
        object Process(IService service, RequestData requestData);
    }

    public interface IProcessor<T, TOut>: IProcessor
       where T : ActionData
    {
        TOut Process(IService serice, T data);
    }
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330280
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

И как же вы реализуете такой класс?

Код: c#
1.
2.
3.
4.
5.
    public class RegisterCardProcessor : IProcessor<RegisterCardActionData, Object>
    { }

     public class RegisterCardActionData : ActionData
     { }
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330420
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

Реализовать надо IProcessor, а не Processor<T, TOut>. Я жы пример привёл. Для чего спрашивается?
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330502
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Я имел в виду, как будет описан класс реализующий этот интерфейс?
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330555
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

Из твоего же примера:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    public class RegisterCardProcessor : IProcessor, IProcessor<RegisterCardActionData, ResponseData>
    {
        public ResponseData Process(IService serice, RegisterCardActionData data)
        {
            return serice.RegisterCard(data.CardData);
        }

        object IProcessor.Process(IService service, ActionData requestData)
        {
            return service.RegisterCard(data.CardData);
        }
    }



Еще можно вызвать из IProcessor.Process собственную реализацию this.Process с приведением типов.
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330607
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Код: c#
1.
2.
3.
4.
object IProcessor.Process(IService service, ActionData requestData)
        {
            return service.RegisterCard(data.CardData);
        }





В этом методе что-то не то, потому что переменная data отсутствует, а переменная requestData не имеет свойства CardData или я не понял чего?
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330640
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

я не проверял соответствие имён переменных, но да requestData это твоя data. А чтобы добраться до CardData, приводи data к нужному тебе типу, ну или общий тип должен иметь это свойство. Тут я уже не знаю твоей логики.

всё что я тебе привёл это решает проблему с Dictionaty, ведь именно об этом ты просил? не получится на 2 стула сесть, либо только шаблоны и без словаря, либо +общий не шаблонный метод и словарь.

выбирай.
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39330819
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Вообще получится, если сделать так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
            private readonly Dictionary<ActionType, Object> _processors = new Dictionary<ActionType, Object>()
            {
               { ActionType.RegisterCard, new RegisterCardProcessor() },
            }
 
            dynamic data = requestData.RequestData;
            dynamic processor = _processors[requestData.Action];
            object result = processor.Process(_rightholdersBus, data);



И нужен всего 1 интерфейс, которой Generic
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39331149
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

можно и так, но ты уходишь в динамику, теряешь в производительности, теряешь возможность статической проверки на этапе компиляции, повышаются шансы получения внезапных рантайм ошибок и конкретно снижается читаемость, ибо глядя на определение словаря непонятно что там должно быть в Object, в общем не ясно чего ради это всё затевалось. но дело твоё.
...
Рейтинг: 0 / 0
Dictionary. Добавление
    #39331537
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Спасибо, я думаю перепишу на общий интерфейс и добавлю приведение типов.
Мне тоже динамика не оч.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Dictionary. Добавление
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]