|
Net Core 3.1 Дженерики, наследование универсальных параметров
|
|||
---|---|---|---|
#18+
Добрый день. Есть такой код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
Проблема в том, что если сделать CommandA cB = new CommandB(); d.Execute(cB); то в TRequest оказывается тип CommandA, а надо каким-то образом CommandB (т.е. реальный), но вызвать нужно именно d.Execute<CommandA>(cB); В реальности известен тоже дженериковский параметр что-то вроде TCommand where TCommand : CommandA, поэтому вызов будет вида d.Execute<TCommand>(cB); Суть в том, что там где вызывается d.Execute известен только тип CommandA, но параметром передается экземпляр CommandB/C/D Есть ли какой-то легальный способ получить реальный тип и через ServiceProvider получить реализацию? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2020, 14:47 |
|
Net Core 3.1 Дженерики, наследование универсальных параметров
|
|||
---|---|---|---|
#18+
Это не проблема, это ровно то, что вы заказали: CommandA cB. То есть приведение cB от типа CommandB к CommandA. Нужен CommandB, пишите CommandB cB или var cB. X-CiteСуть в том, что там где вызывается d.Execute известен только тип CommandAЕсли бы это было правдой, то скомпилировать строку CommandA cB = new CommandB() было бы невозможно. А если вы говорите про потроха Execute, то там неизвестен ни CommandA ни CommandB, только ICommand. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2020, 15:53 |
|
Net Core 3.1 Дженерики, наследование универсальных параметров
|
|||
---|---|---|---|
#18+
ответа к сожалению не знаю, но подскажите где и в каких ситуациях может пригодится приведенный участок кода? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2020, 16:40 |
|
Net Core 3.1 Дженерики, наследование универсальных параметров
|
|||
---|---|---|---|
#18+
vb_sub ответа к сожалению не знаю, но подскажите где и в каких ситуациях может пригодится приведенный участок кода? Типичный паттерн. Курим GoF. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2020, 17:14 |
|
Net Core 3.1 Дженерики, наследование универсальных параметров
|
|||
---|---|---|---|
#18+
непосредственно сам CommandB можно получить из aCommand.GetType() Но тогда как при этом сконструировать IPipeline<CommandB> если CommandB будет не параметром дженерика, а переменной Type. Может есть способ через рефлексию каким-нибудь образом имея описание IPipeline<T> where T : ICommand и CommandB : ICommand в переменных типа Type, создать переменную Type a = typeof(IPipeline<CommandB>) и тогда потом можно вызвать _provider.GetService(a); Что-то вроде: Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2020, 18:07 |
|
Net Core 3.1 Дженерики, наследование универсальных параметров
|
|||
---|---|---|---|
#18+
В общем, получилось как-то так... Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Правда при этом уже TRequest не имеет значения, но можно поступить по другому... Сначала через TRequest ищем сервис, если не нашли, тогда уже через рефлексию, чтобы сэкономить на том, где тип гарантированно известен ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2020, 18:45 |
|
|
start [/forum/topic.php?fid=20&fpage=12&tid=1398618]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 232ms |
total: | 394ms |
0 / 0 |