|
Сконструировать через 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 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
если исключить прокси, конечно же ) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 03:02 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Классы зачем генерить? )) Ну это уже не ко мне - мне их генерить незачем :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 03:14 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Гадство, манипуляции с IL не нравятся антивирусам, нужно по-другому делать. Задача, значит, так стоит (упрощенно): есть расширение для IEnumerable<IData> (IData пустой, но может быть унаследован непустым интерфейсом), которое работает с ним через Reflection. Нужно подсунуть расширению IEnumerable с чем-то, реализующим IData, у чего набор свойств задается динамически так, чтобы Reflection их схавал. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 16:18 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 16:23 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 16:24 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy манипуляции с IL не нравятся антивирусам Это что еще за шляпа такая? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 16:24 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy, А чем вообще самый тупейший рефлекшен не угодил? Там террабайты данных в реалтайм надо молотить что ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 16:25 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy манипуляции с IL не нравятся антивирусам Это что еще за шляпа такая? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 16:27 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy, А чем вообще самый тупейший рефлекшен не угодил? Там террабайты данных в реалтайм надо молотить что ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 16:30 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy fkthat пропущено... Это что еще за шляпа такая? Программа: Authenticode(R) - signing and verifying tool Пользователь: user1 (Активный пользователь) Компонент: Защита от файловых угроз Результат: Обнаружено: HEUR:Trojan.MSIL.Crypt.gen Объект: C:\Users\user1\.nuget\packages\exceldna.addin\1.0.0.9\tools\ExcelDna.xll Причина: Машинное обучение Внутри этой xll тоже есть Emit, коллеге пришлось что-то поменять в исходниках (ExcelDna есть на гитхабе) и создать пакет с собственной сборкой, на которую каспер не ругается. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 17:01 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy fkthat ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 17:25 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy В каком смысле не угодил? Он и используется - берется модель и шерстятся свойства. Проблема возникает, когда модель неизвестна на этапе компиляции, когда ее свойства хранятся в базе, да еще по записям разных таблиц разбросаны. Ничего не понял. Рефлекшен как раз и дает возможность "шерстить модели", которые неизвестны на этапе компиляции. "Позднее связывание". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 17:34 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy Да и вообще дурь там какая-то написана. "Замените атрибутом". А ограничения на дженерики, а экстеншены как они думают на атрибуты вешать? Зачем тебе может понадобиться ограничение на то, что пусто? Это тоже самое, что ограничение на System.Object. Ограничения на дженерики нужны для того, чтобы потребовать от параметра дженерика исполнения какого-то контракта (например, иметь какие-либо методы/свойства, иметь конструктор по умолчанию, быть структурой и т.п.) Какой смысл требовать от параметра выполнения пустого контракта, который ни к чему его не контрактит? С екстеншенами тоже самое. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 17:39 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy, Antonariy Да и вообще дурь там какая-то написана. "Замените атрибутом". А ограничения на дженерики, а экстеншены как они думают на атрибуты вешать? для этого существуют юнит-тесты ) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 17:47 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy Гадство, манипуляции с IL не нравятся антивирусам, нужно по-другому делать. Задача, значит, так стоит (упрощенно): есть расширение для IEnumerable<IData> (IData пустой, но может быть унаследован непустым интерфейсом), которое работает с ним через Reflection. Нужно подсунуть расширению IEnumerable с чем-то, реализующим IData, у чего набор свойств задается динамически так, чтобы Reflection их схавал. В общем, тут иногда шумиха создаётся, когда говоришь людям -- делайте по уму сразу :) Ну так вот он -- яркий пример, когда кривые решения переросли в легаси, и людям приходится страдать и идти на неипические меры, чтобы простейшие вещи втулить :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 17:50 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy Да и вообще дурь там какая-то написана. "Замените атрибутом". А ограничения на дженерики, а экстеншены как они думают на атрибуты вешать? Зачем тебе может понадобиться ограничение на то, что пусто? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 18:00 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy В каком смысле не угодил? Он и используется - берется модель и шерстятся свойства. Проблема возникает, когда модель неизвестна на этапе компиляции, когда ее свойства хранятся в базе, да еще по записям разных таблиц разбросаны. Ничего не понял. Рефлекшен как раз и дает возможность "шерстить модели", которые неизвестны на этапе компиляции. "Позднее связывание". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 18:03 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Antonariy Гадство, манипуляции с IL не нравятся антивирусам, нужно по-другому делать. Задача, значит, так стоит (упрощенно): есть расширение для IEnumerable<IData> (IData пустой, но может быть унаследован непустым интерфейсом), которое работает с ним через Reflection. Нужно подсунуть расширению IEnumerable с чем-то, реализующим IData, у чего набор свойств задается динамически так, чтобы Reflection их схавал. В общем, тут иногда шумиха создаётся, когда говоришь людям -- делайте по уму сразу :) Ну так вот он -- яркий пример, когда кривые решения переросли в легаси, и людям приходится страдать и идти на неипические меры, чтобы простейшие вещи втулить :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 18:07 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt, По уму в данном случае нужно было использовать DataTable? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 18:15 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy То, что пусто, само является ограничением. И что оно ограничивает? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 18:26 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy hVostt, По уму в данном случае нужно было использовать DataTable? конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 18:42 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy То, что пусто, само является ограничением. И что оно ограничивает? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 23:44 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
ViPRos Antonariy hVostt, По уму в данном случае нужно было использовать DataTable? конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2019, 23:45 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy hVostt, По уму в данном случае нужно было использовать DataTable? Не обязательно DataTable, я ж всей задачи не знаю и подробностей. Но да, во многих случаях подойдёт DataTable для динамических моделей данных. Такие вещи как IData, IEntity и т.п. вызывают очень скоро неминуемую протечку абстракции во все щели. Которые потом приходится затыкать рефлекией, эмитом и прочей хернёй. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 02:53 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy ну сравни this object и this IData. а еще Test<T> и Test<T> where T : IData. Давай сравним. И в чем отличие, если IData пустой? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 05:13 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy ну сравни this object и this IData. а еще Test<T> и Test<T> where T : IData. Давай сравним. И в чем отличие, если IData пустой? Если сделать расширение для object, то оно прилипнет ко ВСЕМ типам, где надо и где не надо, засирая интеллисенс. В дженерик без ограничений тоже оказывается возможным передать любой тип. А в реальной жизни и расширения и дженерики как правило все же рассчитаны на работу с ограниченным семейством типов. Это подсказки для разработчиков на уровне компилятора, что можно и что нельзя использовать в соответствующих методах. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 07:55 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy А в реальной жизни и расширения и дженерики как правило все же рассчитаны на работу с ограниченным семейством типов. Это семейство типов определяется тем, что называтеся "контракт". Набор условий, которым удовлетворяют все участники этого семейства. Пустой контракт никаких условий не задаёт, поэтому смысла в нем ноль. Это как на кабаке повесить правило фейс-контроля: "к нам пускаем только тех, у кого как минимум 0 денег в кармане". А про интеллисенс так это вообще бугагос. Архитектим приложение под текстовый редактор, в котором его набираем. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 08:25 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Antonariy hVostt, По уму в данном случае нужно было использовать DataTable? Не обязательно DataTable, я ж всей задачи не знаю и подробностей. Но да, во многих случаях подойдёт DataTable для динамических моделей данных. И проблема лишь в сраном антивирусе, которому не нравятся конкретные слова и буквы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 09:52 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy А в реальной жизни и расширения и дженерики как правило все же рассчитаны на работу с ограниченным семейством типов. Это семейство типов определяется тем, что называтеся "контракт". Набор условий, которым удовлетворяют все участники этого семейства. Пустой контракт никаких условий не задаёт, поэтому смысла в нем ноль. Это как на кабаке повесить правило фейс-контроля: "к нам пускаем только тех, у кого как минимум 0 денег в кармане". А про интеллисенс так это вообще бугагос. Архитектим приложение под текстовый редактор, в котором его набираем. авторПустой контракт никаких условий не задаёт, поэтому смысла в нем ноль.Пустой контракт задает первоначальное условие - принадлежность к этому контракту. Наследуя который, создаются более специализированные контракты, имеющие более специализированные условия. С формальной логикой знаком? Знаешь, что такое закон исключенного третьего? Так вот пустой контракт это и есть реализация этого закона в программировании. Фундаментальная абстракция, разделяющая сущности на те, что ей являются и те, что ей не являются. Впрочем, кому я это объясняю? Пользователю блокнота и консоли. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 10:02 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy используют специализированные инструменты, которые на порядок повышают их производительность и защищают от множества ошибок. По тебе оно заметно. Антивирус работать не дает. Antonariy Пользователю блокнота и консоли. Чаще всего в консоли и компилирую. И тесты прогоняю. Причем очень часто под линуксом. Потому что мне вообще пох, как оно собирается и тестируется в личной студии - меня волнует только, как оно соберется и протестируется на билд-сервере в CI. А ты, наверное, без кнопки Ф5 и жить не можешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 10:28 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy используют специализированные инструменты, которые на порядок повышают их производительность и защищают от множества ошибок. По тебе оно заметно. Антивирус работать не дает. авторА ты, наверное, без кнопки Ф5 и жить не можешь?АТО! И еще без кучи других клавиатурных сокращений. Что никак не связано с наличием билд-сервера, который тоже исправно делает свою работу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 11:14 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy Но по сути, какая разница между DataRow и экземпляром модели? В первом набор полей, характеризующимся названием и типом, во втором набор свойств, характеризующихся названием и типом. В чем отличие? Лишь в наборе слов и букв, которыми осуществляется манипуляция полем/свойством. Даже не структурой алгоритма, а более мелкими деталями. При этом DataRow проигрывает в способности кастоваться к какому-нибудь типу, за которым может следить компилятор. Да, кажется ты не понимаешь. DataRow может хранить любой кортеж, DataTable позволяет обратиться к модели данных, которую можно сконструировать в рантайме без рефлексии. И без рефлексии её прочитать. Если у тебя все модели статические 100% и не предполагается расширение извне, т.е. ты работаешь с ORM, то ты можешь работать с классами. Но в ином случае, тебе нужно будет предоставить свой провайдер мета-модели, вместо работы с рефлексии напрямую. У тебя нет ни абстрактного провайдера, ни динамической структуру для передачи данных (DataTable). Отсюда боль и страдания. Antonariy И проблема лишь в сраном антивирусе, которому не нравятся конкретные слова и буквы. Ну антивирус это не единственная проблема. Всё решение -- проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 11:16 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy попкорн у меня есть, жги. Ну, пока что ты тут со своими проблемами (которые сам себе создал) о помощи просишь, а не я. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 11:20 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Ну антивирус это не единственная проблема. Всё решение -- проблема. "Разруха проблема в головах". ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 11:22 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy И еще без кучи других клавиатурных сокращений. У меня VsVim установлен екстеншеном, т.ч. шорткатов, наверное, поболее. Осталось только померить у кого шорткат длинее. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 11:47 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Да, кажется ты не понимаешь. DataRow может хранить любой кортеж, DataTable позволяет обратиться к модели данных, которую можно сконструировать в рантайме без рефлексии. И без рефлексии её прочитать. авторУ тебя нет ни абстрактного провайдера, ни динамической структуру для передачи данных (DataTable). Отсюда боль и страдания.Вот я и пытаюсь его запилить перебирая варианты. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 11:49 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
fkthat Antonariy попкорн у меня есть, жги. Ну, пока что ты тут со своими проблемами (которые сам себе создал) о помощи просишь, а не я. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 11:56 |
|
Сконструировать через Emit класс, реализущий заданный интерфейс
|
|||
---|---|---|---|
#18+
Antonariy hVostt Да, кажется ты не понимаешь. DataRow может хранить любой кортеж, DataTable позволяет обратиться к модели данных, которую можно сконструировать в рантайме без рефлексии. И без рефлексии её прочитать. Плохого ничего нет. Но и хорошего. Рефлексию используют не от хорошей архитектуры. Antonariy авторУ тебя нет ни абстрактного провайдера, ни динамической структуру для передачи данных (DataTable). Отсюда боль и страдания. Нет соответствующей абстракции. Находишься в ситуации, когда тебе забыли выдать ложку, и ты вынужден её вытачивать из подручных инструментов сам :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2019, 13:25 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1398687]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
108ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 221ms |
0 / 0 |