169 похожих чатов

Я пытаюсь сделать свою реализацию медиатора, и при попытке скастить

object к хендлеру, хотя в дебагере видно, что получается нормальный хендлер, я получаю InvalidCastException. Ошибка происходит тут:
return ((IHandler<IRequest<TResponse>, TResponse>)handler).HandleAsync(request);
Подсмотрел как, это реализовано у Богарда, там используются врапперы, подскажите, пожалуйста, почему не проходит каст и что стоит по этому поводу почитать?

Метод, где происходит ошибка:

public Task<TResponse> Send<TResponse>(IRequest<TResponse> request)
{
var requestType = request.GetType();
if (!_handlerInfos.ContainsKey(requestType))
{
throw new InvalidOperationException($"No handler found for {requestType.FullName}");
}

var handlerType = _handlerInfos[requestType];
var handler = _serviceResolver.Invoke(handlerType);

return ((IHandler<IRequest<TResponse>, TResponse>)handler).HandleAsync(request);
}


Полный код класса

16 ответов

21 просмотр

Просто навскидку: ты уверен что var handler имеет тип object?

А скрин с дебаггера дай

Да, он тут правильно себя ведет. Ты пытаешься скастить PrintTextHandler : IHandler<PrintTextRequest, bool> к IHandler<IRequest<TResponse>, TResponse> Но вот в чем дело: первый IHandler не работает с IRequest<TResponse>. Он работает с PrintTextRequest. Другими словами, ты не можешь ему передать просто IRequest<TResponse>, только PrintTextRequest, который является более узким подмножеством. Поэтому он должен либо у тебя быть IHandler<IRequest<bool>, bool>, либо ты должен вводить новый генерик тип, которому в данном случае будет подставляться PrintTextRequest, и кастовать к IHandler<SpecificRequestType, TResponse>

смахивает на дикий оверхед)0

Vladyslav Bardin
Где именно?

ну на том сообщении

Vladyslav-Bardin Автор вопроса
Etki
screenshot

я пытаюсь вникнуть, слишком много буковок

Vladyslav Bardin
я пытаюсь вникнуть, слишком много буковок

Если вкратце, то ты кастишь Interface<V> к Interface<T>, где V (твой PrintRequest) наследник T. Так как тип заявляет что работает только с V, ты не можешь его скастовать к типу, который работает со всеми T, а в системе типов именно так и получается.

Vladyslav-Bardin Автор вопроса
Etki
Да, он тут правильно себя ведет. Ты пытаешься ска...

Спасибо большое, буду думать как лучше сделать. Кастить к IHandler<IRequest<bool>, bool> не вариант, а вот с доп. дженериком попробую что-то придумать

Vladyslav Bardin
Спасибо большое, буду думать как лучше сделать. Ка...

Еще вариант, который очевидно будет работать class ExampleHandler : IHandler<IRequest<bool>, bool> { public bool Execute(IRequest<bool> request) { return true; } }

Etki
Да, он тут правильно себя ведет. Ты пытаешься ска...

Ну собственно я сделал практически тоже самое, о чем говорил Etki

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта