|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#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.
А так создается сам класс, тип интерфейса, который реализовать нужно, указан: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ну и добавление свойств из интерфейса: Код: c# 1. 2.
Но CreateProperty создает свойства, не связанные с интерфейсом. Экземпляр класса, созданный через Activator, без вопросов кастуется к интерфейсу, но если обратиться к экземпляру через интерфейс, то вылезает ошибка, что соответствующее свойство не реализовано. Вопрос - как свойство класса связать со свойством интерфейса? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 17:30 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Попытался унаследоваться от базового класса с уже реализованными свойствами, и тоже облом. Ошибок нет, но в окне контрольных значений видно, что в сконструированном классе появляются дубли базовых свойств, перекрывающие их. Соответственно, Reflection получившегося типа дергает перекрывшие, а не базовые. PS Туплю, в источнике свойств для Emit есть одноименные записи, отсюда перекрытие. Остался вопрос по интерфейсам. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 17:50 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy, TypeBuilder.AddInterfaceImplementation(Type) Method ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 19:01 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Слона-то я и не заметил, пытался найти подсказки в DefineProperty. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 19:15 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
нафига такие сложности? хотелось бы узнать, зачем вам это, не обязательно сильно детально. не является ли это преждевременной оптимизацией или попытка сделать просто сложным? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 21:09 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Roman Mejtes или попытка сделать просто сложным? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 23:34 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy, прежде чем идти в emit, я бы рекомендовал сначала решать задачу через Expression Tree, пока не упрёшься в затык по производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 03:01 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Roman Mejtes нафига такие сложности? хотелось бы узнать, зачем вам это, не обязательно сильно детально. не является ли это преждевременной оптимизацией или попытка сделать просто сложным? ) Ну а "просто" уже было сделано - к записи с фиксированными полями цеплялись наборы поле-значение, но это не спасло от говнокода. Да и отлаживать это сложнее, моск лучше анализирует коллекцию записей, чем коллекцию коллекций поле-значение. hVosttпрежде чем идти в emit, я бы рекомендовал сначала решать задачу через Expression Tree, пока не упрёшься в затык по производительности.Посмотрел ET, показалось слишком мутным и сложным. Фабрика моделей на Emit уже заработала (CreateProperty это 80% ее кода), не вижу смысла переделывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 08:47 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy, а без генерации классов, просто обычные модели данных, типа DataTable чем не угодили? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 21:10 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy Ну а "просто" уже было сделано - к записи с фиксированными полями цеплялись наборы поле-значение, но это не спасло от говнокода. Да и отлаживать это сложнее, моск лучше анализирует коллекцию записей, чем коллекцию коллекций поле-значение. Странно. Ну ладно. Но всё равно капец как странно. Кодогенерация в рантайме нужна по сути как костыль для биндинга к существующим решениям, или для работы с embedded кодом. Для моделей это оверхед жёсткий имх. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 21:12 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Antonariy, а без генерации классов, просто обычные модели данных, типа DataTable чем не угодили? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 22:22 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Так и есть, это костыль к существующему решению, и очень эффективный костыль. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 22:24 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy, ок, понял. если это для существующей архитектура, то оправдано. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 01:06 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy очень эффективный костыль насчёт эффективности не соглашусь ) как минимум с точки зрения сопровождения и развития.. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 01:07 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Для моделей это оверхед жёсткий имх. Решение может быть очень даже годное, если, скажем, надо делать что-нибудь, типа ОРМа. Допустим, нужен код, который будет работать с классами, которые мы заранее не знаем. Единственный способ работать с ними "в лоб" - это было бы через рефлекшен, что для постоянного повторного использования было бы неэффективно, и, как выход - это использовать рефлекшен только однократно, чтобы проанализировать неизвестный класс и emit-нуть код работающий с ним уже без рефлекшена. Но, деревья выражений, конечно, проще для этого - у них под капотом тот же emit, по сути, они просто добавляют поверх него более удобный API. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 05:07 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat, да полно вариантов CodeDom, ExpressionTree, Reflection, Emit ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 08:32 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Antonariy очень эффективный костыль насчёт эффективности не соглашусь ) как минимум с точки зрения сопровождения и развития.. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 10:46 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy, да фуфло все это DataSet наше все ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 14:41 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Да на здоровье) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 15:23 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy, так важна производительность? замеры делали? может узкое место не там. Есть же куча всяких мапперов работающих точно так же, поищите всё уже написано :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 18:49 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Roman Mejtes Antonariy, так важна производительность? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2019, 20:21 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Решение может быть очень даже годное, если, скажем, надо делать что-нибудь, типа ОРМа. Так суть ОРМ-а, это фиксированные, известные на этапе компиляции модели данных. Какой профит от заэмиченных классов, если ты тупо код не можешь написать для работы с данными, так как классов не знаешь? Максимум пробросить в эбмбеддед какой-нибудь. Но и там отлично всё решается без генерации классов. fkthat Допустим, нужен код, который будет работать с классами, которые мы заранее не знаем. Как ты напишешь код для классов, которых не знаешь? ))) fkthat Но, деревья выражений, конечно, проще для этого - у них под капотом тот же emit, по сути, они просто добавляют поверх него более удобный API. Деревья выражений позволяют в динамике скомпилить операции над данными, как бы очевидный профит. Как бы для динамических моделей данных, нужны подходящие для этого структуры. Вот как пример DataSet. Никакого рефлекшена, никакого треша. Вся модель на руках. С данными работаем обычным образом. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 00:18 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Так суть ОРМ-а, это фиксированные, известные на этапе компиляции модели данных. Да, но не на момент компиляции самого ОРМ-а. hVostt Какой профит от заэмиченных классов, если ты тупо код не можешь написать для работы с данными, так как классов не знаешь? Вот тут и начинается интересное. Допустим у меня есть данные в нетипизированном виде (что-нибудь, наподобие Dictionary<string, object>) и есть ссылка на объект, тип которого я не знаю, и у меня задача скопировать словарь в этот объект по принципу ключи это имена свойств, а значения это значения соответствующих свойств. Это можно очень легко сделать через reflection. Но если это надо делать черти-сколько раз, то reflection это страшный тормоз. Поэтому можно сделать хитрее - прочитать один раз через reflection нужную инфу об объекте и по этой инфе сгенерировать emit-ом код, который будет работать уже без рефлекшена. hVostt Деревья выражений позволяют в динамике скомпилить операции над данными, как бы очевидный профит. Это именно то, что я выше и попытался описать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 02:42 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat hVostt Какой профит от заэмиченных классов, если ты тупо код не можешь написать для работы с данными, так как классов не знаешь? Вот тут и начинается интересное. Допустим у меня есть данные в нетипизированном виде (что-нибудь, наподобие Dictionary<string, object>) и есть ссылка на объект, тип которого я не знаю, и у меня задача скопировать словарь в этот объект по принципу ключи это имена свойств, а значения это значения соответствующих свойств. Это можно очень легко сделать через reflection. Но если это надо делать черти-сколько раз, то reflection это страшный тормоз. Поэтому можно сделать хитрее - прочитать один раз через reflection нужную инфу об объекте и по этой инфе сгенерировать emit-ом код, который будет работать уже без рефлекшена. Код логики генерить понятно зачем, ради производительности. И тут лучше подойдут expression tree. Классы зачем генерить? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 03:00 |
|
|
start [/forum/topic.php?fid=20&fpage=14&tid=1398687]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 155ms |
0 / 0 |