powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сконструировать через Emit класс, реализущий заданный интерфейс
62 сообщений из 62, показаны все 3 страниц
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899227
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел в тырнетах код, который класс конструирует, вот метод, создающий свойство:

Код: 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.
        private static void CreateProperty(this TypeBuilder tb, string propertyName, Type propertyType)
        {
            var fieldBuilder = tb.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
            var propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
            var attrs = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
            var getPropMthdBldr = tb.DefineMethod("get_" + propertyName, attrs, propertyType, Type.EmptyTypes);
            var getIl = getPropMthdBldr.GetILGenerator();

            getIl.Emit(OpCodes.Ldarg_0);
            getIl.Emit(OpCodes.Ldfld, fieldBuilder);
            getIl.Emit(OpCodes.Ret);

            var setPropMthdBldr = tb.DefineMethod("set_" + propertyName, attrs, null, new[] { propertyType });
            var setIl = setPropMthdBldr.GetILGenerator();

            setIl.MarkLabel(setIl.DefineLabel());
            setIl.Emit(OpCodes.Ldarg_0);
            setIl.Emit(OpCodes.Ldarg_1);
            setIl.Emit(OpCodes.Stfld, fieldBuilder);

            setIl.Emit(OpCodes.Nop);
            setIl.MarkLabel(setIl.DefineLabel());
            setIl.Emit(OpCodes.Ret);

            propertyBuilder.SetGetMethod(getPropMthdBldr);
            propertyBuilder.SetSetMethod(setPropMthdBldr);
        }



А так создается сам класс, тип интерфейса, который реализовать нужно, указан:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var tb = moduleBuilder.DefineType(typeName,
                    TypeAttributes.Public |
                    TypeAttributes.Class |
                    TypeAttributes.AutoClass |
                    TypeAttributes.AnsiClass |
                    TypeAttributes.BeforeFieldInit |
                    TypeAttributes.AutoLayout,
                    null,
                    new[] { interfaceType });


Ну и добавление свойств из интерфейса:
Код: c#
1.
2.
            foreach (var property in interfaceType.GetProperties())
                tb.CreateProperty(property.Name, property.PropertyType);

Но CreateProperty создает свойства, не связанные с интерфейсом. Экземпляр класса, созданный через Activator, без вопросов кастуется к интерфейсу, но если обратиться к экземпляру через интерфейс, то вылезает ошибка, что соответствующее свойство не реализовано.

Вопрос - как свойство класса связать со свойством интерфейса?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899232
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытался унаследоваться от базового класса с уже реализованными свойствами, и тоже облом. Ошибок нет, но в окне контрольных значений видно, что в сконструированном классе появляются дубли базовых свойств, перекрывающие их. Соответственно, Reflection получившегося типа дергает перекрывшие, а не базовые.

PS
Туплю, в источнике свойств для Emit есть одноименные записи, отсюда перекрытие.

Остался вопрос по интерфейсам.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899250
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899261
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слона-то я и не заметил, пытался найти подсказки в DefineProperty.
Спасибо.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899294
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нафига такие сложности?
хотелось бы узнать, зачем вам это, не обязательно сильно детально.
не является ли это преждевременной оптимизацией или попытка сделать просто сложным? )
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899318
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
или попытка сделать просто сложным?
скорее - свой собственный домотканный велосипед... иногда имеет смысл...
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899341
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

прежде чем идти в emit, я бы рекомендовал сначала решать задачу через Expression Tree, пока не упрёшься в затык по производительности.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899351
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
нафига такие сложности?
хотелось бы узнать, зачем вам это, не обязательно сильно детально.
не является ли это преждевременной оптимизацией или попытка сделать просто сложным? )
Вывод данных в эксель. Есть два вылизанных механизма, покрывающих все кейсы внешнего вида финального результата. Источником данных служит плоская серверная модель IEnumerable<IData>, с него получаемая или определенная на клиенте. Но описать класс и реализовать IData можно не всегда, есть несколько случаев с переменным количеством полей, собираемых из нескольких таких моделей. Под них есть зоопарк велосипедов, выводящих такие данные уникальным для каждого набора способом. Я хочу избавиться от этого зоопарка, создавая динамические модели на основе того же IEnumerable<IData>, и этот подход уже дал плоды, вскрыв несколько багов как в велосипедах, так и в данных на сервере. При правильном связывании данных, например, полезли дубли записей (косяки во внешних ключах) или новые данные, которых раньше видно не было (косяки в выводе). Пара велосипедов свелась к IEnumerable<IEnumerable<IData>>, но остальным требуется труъ динамика, набор жестких табличек не катит.

Ну а "просто" уже было сделано - к записи с фиксированными полями цеплялись наборы поле-значение, но это не спасло от говнокода. Да и отлаживать это сложнее, моск лучше анализирует коллекцию записей, чем коллекцию коллекций поле-значение.

hVosttпрежде чем идти в emit, я бы рекомендовал сначала решать задачу через Expression Tree, пока не упрёшься в затык по производительности.Посмотрел ET, показалось слишком мутным и сложным. Фабрика моделей на Emit уже заработала (CreateProperty это 80% ее кода), не вижу смысла переделывать.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899461
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

а без генерации классов, просто обычные модели данных, типа DataTable чем не угодили?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899462
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
Ну а "просто" уже было сделано - к записи с фиксированными полями цеплялись наборы поле-значение, но это не спасло от говнокода. Да и отлаживать это сложнее, моск лучше анализирует коллекцию записей, чем коллекцию коллекций поле-значение.


Странно. Ну ладно. Но всё равно капец как странно. Кодогенерация в рантайме нужна по сути как костыль для биндинга к существующим решениям, или для работы с embedded кодом.

Для моделей это оверхед жёсткий имх.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899468
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Antonariy,

а без генерации классов, просто обычные модели данных, типа DataTable чем не угодили?
Они изначально не использовались, под них нужно изобретать новые велосипеды. Есть объект, описывающий таблицу, завязанный на IData, есть объект, выводящий описание в эксель, тоже завязанный на IData, нахрен нужно вводить новые сущности? Проще привести данные к IData, тем более, что с твоим подходом их все равно нужно приводить к DataTable. К тому же это обошлось всего в одну страницу кода фабрики и одну строчку вызова фабрики. Проще на порядок.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899469
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и есть, это костыль к существующему решению, и очень эффективный костыль.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899494
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

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


насчёт эффективности не соглашусь )
как минимум с точки зрения сопровождения и развития..
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899510
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Для моделей это оверхед жёсткий имх.

Решение может быть очень даже годное, если, скажем, надо делать что-нибудь, типа ОРМа. Допустим, нужен код, который будет работать с классами, которые мы заранее не знаем. Единственный способ работать с ними "в лоб" - это было бы через рефлекшен, что для постоянного повторного использования было бы неэффективно, и, как выход - это использовать рефлекшен только однократно, чтобы проанализировать неизвестный класс и emit-нуть код работающий с ним уже без рефлекшена. Но, деревья выражений, конечно, проще для этого - у них под капотом тот же emit, по сути, они просто добавляют поверх него более удобный API.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899514
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
да полно вариантов
CodeDom, ExpressionTree, Reflection, Emit
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899525
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Antonariy
очень эффективный костыль


насчёт эффективности не соглашусь )
как минимум с точки зрения сопровождения и развития..
Да там нечего сопровождать и развивать. Передашь фабрике модель-источник полей и типов и лямбду, возвращающую имя поля и его тип из этого источника, получаешь тип с этими полями, вот и всё, дешево и сердито.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899572
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

да фуфло все это
DataSet наше все
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899585
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да на здоровье)
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899620
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

так важна производительность? замеры делали?
может узкое место не там.
Есть же куча всяких мапперов работающих точно так же, поищите всё уже написано :)
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899641
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
Antonariy,

так важна производительность?
нет
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899703
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Решение может быть очень даже годное, если, скажем, надо делать что-нибудь, типа ОРМа.


Так суть ОРМ-а, это фиксированные, известные на этапе компиляции модели данных.
Какой профит от заэмиченных классов, если ты тупо код не можешь написать для работы с данными, так как классов не знаешь?

Максимум пробросить в эбмбеддед какой-нибудь. Но и там отлично всё решается без генерации классов.


fkthat
Допустим, нужен код, который будет работать с классами, которые мы заранее не знаем.


Как ты напишешь код для классов, которых не знаешь? )))


fkthat
Но, деревья выражений, конечно, проще для этого - у них под капотом тот же emit, по сути, они просто добавляют поверх него более удобный API.


Деревья выражений позволяют в динамике скомпилить операции над данными, как бы очевидный профит.

Как бы для динамических моделей данных, нужны подходящие для этого структуры. Вот как пример DataSet. Никакого рефлекшена, никакого треша. Вся модель на руках. С данными работаем обычным образом.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899727
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Так суть ОРМ-а, это фиксированные, известные на этапе компиляции модели данных.

Да, но не на момент компиляции самого ОРМ-а.

hVostt
Какой профит от заэмиченных классов, если ты тупо код не можешь написать для работы с данными, так как классов не знаешь?

Вот тут и начинается интересное. Допустим у меня есть данные в нетипизированном виде (что-нибудь, наподобие Dictionary<string, object>) и есть ссылка на объект, тип которого я не знаю, и у меня задача скопировать словарь в этот объект по принципу ключи это имена свойств, а значения это значения соответствующих свойств. Это можно очень легко сделать через reflection. Но если это надо делать черти-сколько раз, то reflection это страшный тормоз. Поэтому можно сделать хитрее - прочитать один раз через reflection нужную инфу об объекте и по этой инфе сгенерировать emit-ом код, который будет работать уже без рефлекшена.

hVostt
Деревья выражений позволяют в динамике скомпилить операции над данными, как бы очевидный профит.

Это именно то, что я выше и попытался описать.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899728
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Какой профит от заэмиченных классов, если ты тупо код не можешь написать для работы с данными, так как классов не знаешь?

Вот тут и начинается интересное. Допустим у меня есть данные в нетипизированном виде (что-нибудь, наподобие Dictionary<string, object>) и есть ссылка на объект, тип которого я не знаю, и у меня задача скопировать словарь в этот объект по принципу ключи это имена свойств, а значения это значения соответствующих свойств. Это можно очень легко сделать через reflection. Но если это надо делать черти-сколько раз, то reflection это страшный тормоз. Поэтому можно сделать хитрее - прочитать один раз через reflection нужную инфу об объекте и по этой инфе сгенерировать emit-ом код, который будет работать уже без рефлекшена.


Код логики генерить понятно зачем, ради производительности. И тут лучше подойдут expression tree.

Классы зачем генерить? ))
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899729
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если исключить прокси, конечно же )
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39899730
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Классы зачем генерить? ))

Ну это уже не ко мне - мне их генерить незачем :)
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900146
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гадство, манипуляции с IL не нравятся антивирусам, нужно по-другому делать.

Задача, значит, так стоит (упрощенно): есть расширение для IEnumerable<IData> (IData пустой, но может быть унаследован непустым интерфейсом), которое работает с ним через Reflection. Нужно подсунуть расширению IEnumerable с чем-то, реализующим IData, у чего набор свойств задается динамически так, чтобы Reflection их схавал.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900154
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
IData пустой

CA1040: Avoid empty interfaces
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900155
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
IData пустой

CA1040: Avoid empty interfaces
Совет не по адресу, это легаси.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900156
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
манипуляции с IL не нравятся антивирусам

Это что еще за шляпа такая?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900157
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

А чем вообще самый тупейший рефлекшен не угодил? Там террабайты данных в реалтайм надо молотить что ли?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900163
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
манипуляции с IL не нравятся антивирусам

Это что еще за шляпа такая?
Что за шляпа IL или что за шляпа антивирусы?)
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900168
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy,

А чем вообще самый тупейший рефлекшен не угодил? Там террабайты данных в реалтайм надо молотить что ли?
В каком смысле не угодил? Он и используется - берется модель и шерстятся свойства. Проблема возникает, когда модель неизвестна на этапе компиляции, когда ее свойства хранятся в базе, да еще по записям разных таблиц разбросаны.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900220
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
fkthat
пропущено...

Это что еще за шляпа такая?
Что за шляпа IL или что за шляпа антивирусы?)

Программа: 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 есть на гитхабе) и создать пакет с собственной сборкой, на которую каспер не ругается.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900257
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
fkthat
пропущено...

CA1040: Avoid empty interfaces
Совет не по адресу, это легаси.
Да и вообще дурь там какая-то написана. "Замените атрибутом". А ограничения на дженерики, а экстеншены как они думают на атрибуты вешать?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900272
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
В каком смысле не угодил? Он и используется - берется модель и шерстятся свойства. Проблема возникает, когда модель неизвестна на этапе компиляции, когда ее свойства хранятся в базе, да еще по записям разных таблиц разбросаны.

Ничего не понял. Рефлекшен как раз и дает возможность "шерстить модели", которые неизвестны на этапе компиляции. "Позднее связывание".
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900281
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
Да и вообще дурь там какая-то написана. "Замените атрибутом". А ограничения на дженерики, а экстеншены как они думают на атрибуты вешать?

Зачем тебе может понадобиться ограничение на то, что пусто? Это тоже самое, что ограничение на System.Object. Ограничения на дженерики нужны для того, чтобы потребовать от параметра дженерика исполнения какого-то контракта (например, иметь какие-либо методы/свойства, иметь конструктор по умолчанию, быть структурой и т.п.) Какой смысл требовать от параметра выполнения пустого контракта, который ни к чему его не контрактит? С екстеншенами тоже самое.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900302
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,


Antonariy
Да и вообще дурь там какая-то написана. "Замените атрибутом". А ограничения на дженерики, а экстеншены как они думают на атрибуты вешать?


для этого существуют юнит-тесты )
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900308
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
Гадство, манипуляции с IL не нравятся антивирусам, нужно по-другому делать.

Задача, значит, так стоит (упрощенно): есть расширение для IEnumerable<IData> (IData пустой, но может быть унаследован непустым интерфейсом), которое работает с ним через Reflection. Нужно подсунуть расширению IEnumerable с чем-то, реализующим IData, у чего набор свойств задается динамически так, чтобы Reflection их схавал.


В общем, тут иногда шумиха создаётся, когда говоришь людям -- делайте по уму сразу :)

Ну так вот он -- яркий пример, когда кривые решения переросли в легаси, и людям приходится страдать и идти на неипические меры, чтобы простейшие вещи втулить :)
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900323
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
Да и вообще дурь там какая-то написана. "Замените атрибутом". А ограничения на дженерики, а экстеншены как они думают на атрибуты вешать?

Зачем тебе может понадобиться ограничение на то, что пусто?
То, что пусто, само является ограничением.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900327
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
В каком смысле не угодил? Он и используется - берется модель и шерстятся свойства. Проблема возникает, когда модель неизвестна на этапе компиляции, когда ее свойства хранятся в базе, да еще по записям разных таблиц разбросаны.

Ничего не понял. Рефлекшен как раз и дает возможность "шерстить модели", которые неизвестны на этапе компиляции. "Позднее связывание".
Поправочка: которые вообще не существуют на этапе компиляции.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900330
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Antonariy
Гадство, манипуляции с IL не нравятся антивирусам, нужно по-другому делать.

Задача, значит, так стоит (упрощенно): есть расширение для IEnumerable<IData> (IData пустой, но может быть унаследован непустым интерфейсом), которое работает с ним через Reflection. Нужно подсунуть расширению IEnumerable с чем-то, реализующим IData, у чего набор свойств задается динамически так, чтобы Reflection их схавал.


В общем, тут иногда шумиха создаётся, когда говоришь людям -- делайте по уму сразу :)

Ну так вот он -- яркий пример, когда кривые решения переросли в легаси, и людям приходится страдать и идти на неипические меры, чтобы простейшие вещи втулить :)
У меня карма такая - переписывать чужой говнокод.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900337
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

По уму в данном случае нужно было использовать DataTable?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900351
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
То, что пусто, само является ограничением.

И что оно ограничивает?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900362
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
hVostt,

По уму в данном случае нужно было использовать DataTable?

конечно
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900496
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
То, что пусто, само является ограничением.

И что оно ограничивает?
ну сравни this object и this IData. а еще Test<T> и Test<T> where T : IData.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900498
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Antonariy
hVostt,

По уму в данном случае нужно было использовать DataTable?

конечно
хотелось бы услышать начальника транспортного отдела.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900537
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
hVostt,

По уму в данном случае нужно было использовать DataTable?


Не обязательно DataTable, я ж всей задачи не знаю и подробностей. Но да, во многих случаях подойдёт DataTable для динамических моделей данных.

Такие вещи как IData, IEntity и т.п. вызывают очень скоро неминуемую протечку абстракции во все щели. Которые потом приходится затыкать рефлекией, эмитом и прочей хернёй.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900547
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
ну сравни this object и this IData. а еще Test<T> и Test<T> where T : IData.

Давай сравним. И в чем отличие, если IData пустой?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900569
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
ну сравни this object и this IData. а еще Test<T> и Test<T> where T : IData.

Давай сравним. И в чем отличие, если IData пустой?
то есть это не очевидно? Удивительно.

Если сделать расширение для object, то оно прилипнет ко ВСЕМ типам, где надо и где не надо, засирая интеллисенс. В дженерик без ограничений тоже оказывается возможным передать любой тип. А в реальной жизни и расширения и дженерики как правило все же рассчитаны на работу с ограниченным семейством типов. Это подсказки для разработчиков на уровне компилятора, что можно и что нельзя использовать в соответствующих методах.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900578
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
А в реальной жизни и расширения и дженерики как правило все же рассчитаны на работу с ограниченным семейством типов.

Это семейство типов определяется тем, что называтеся "контракт". Набор условий, которым удовлетворяют все участники этого семейства. Пустой контракт никаких условий не задаёт, поэтому смысла в нем ноль. Это как на кабаке повесить правило фейс-контроля: "к нам пускаем только тех, у кого как минимум 0 денег в кармане".

А про интеллисенс так это вообще бугагос. Архитектим приложение под текстовый редактор, в котором его набираем.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900613
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Antonariy
hVostt,

По уму в данном случае нужно было использовать DataTable?


Не обязательно DataTable, я ж всей задачи не знаю и подробностей. Но да, во многих случаях подойдёт DataTable для динамических моделей данных.
Но по сути, какая разница между DataRow и экземпляром модели? В первом набор полей, характеризующимся названием и типом, во втором набор свойств, характеризующихся названием и типом. В чем отличие? Лишь в наборе слов и букв, которыми осуществляется манипуляция полем/свойством. Даже не структурой алгоритма, а более мелкими деталями. При этом DataRow проигрывает в способности кастоваться к какому-нибудь типу, за которым может следить компилятор.

И проблема лишь в сраном антивирусе, которому не нравятся конкретные слова и буквы.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900621
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
А в реальной жизни и расширения и дженерики как правило все же рассчитаны на работу с ограниченным семейством типов.

Это семейство типов определяется тем, что называтеся "контракт". Набор условий, которым удовлетворяют все участники этого семейства. Пустой контракт никаких условий не задаёт, поэтому смысла в нем ноль. Это как на кабаке повесить правило фейс-контроля: "к нам пускаем только тех, у кого как минимум 0 денег в кармане".

А про интеллисенс так это вообще бугагос. Архитектим приложение под текстовый редактор, в котором его набираем.
Ну если ты кодишь в блокноте, а компилируешь в консоли, то имеешь право бугагировать. А вменяемые люди, коих подавляющее большинство, используют специализированные инструменты, которые на порядок повышают их производительность и защищают от множества ошибок. И чем более специализирован инструмент, тем более эффективно он решает свою задачу. Ограничение типов это сужение специализации.

авторПустой контракт никаких условий не задаёт, поэтому смысла в нем ноль.Пустой контракт задает первоначальное условие - принадлежность к этому контракту. Наследуя который, создаются более специализированные контракты, имеющие более специализированные условия.

С формальной логикой знаком? Знаешь, что такое закон исключенного третьего? Так вот пустой контракт это и есть реализация этого закона в программировании. Фундаментальная абстракция, разделяющая сущности на те, что ей являются и те, что ей не являются.

Впрочем, кому я это объясняю? Пользователю блокнота и консоли.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900647
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
используют специализированные инструменты, которые на порядок повышают их производительность и защищают от множества ошибок.

По тебе оно заметно. Антивирус работать не дает.

Antonariy
Пользователю блокнота и консоли.

Чаще всего в консоли и компилирую. И тесты прогоняю. Причем очень часто под линуксом. Потому что мне вообще пох, как оно собирается и тестируется в личной студии - меня волнует только, как оно соберется и протестируется на билд-сервере в CI. А ты, наверное, без кнопки Ф5 и жить не можешь?
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900668
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
используют специализированные инструменты, которые на порядок повышают их производительность и защищают от множества ошибок.

По тебе оно заметно. Антивирус работать не дает.
Судя по тому, как ты вильнул седалищем от пустых интерфейсов к проблемам использования Emit, по интерфейсам адекватная аргументация у тебя иссякла, но высрацца еще хочется. Ну, попкорн у меня есть, жги.

авторА ты, наверное, без кнопки Ф5 и жить не можешь?АТО! И еще без кучи других клавиатурных сокращений. Что никак не связано с наличием билд-сервера, который тоже исправно делает свою работу.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900671
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
Но по сути, какая разница между DataRow и экземпляром модели? В первом набор полей, характеризующимся названием и типом, во втором набор свойств, характеризующихся названием и типом. В чем отличие? Лишь в наборе слов и букв, которыми осуществляется манипуляция полем/свойством. Даже не структурой алгоритма, а более мелкими деталями. При этом DataRow проигрывает в способности кастоваться к какому-нибудь типу, за которым может следить компилятор.


Да, кажется ты не понимаешь. DataRow может хранить любой кортеж, DataTable позволяет обратиться к модели данных, которую можно сконструировать в рантайме без рефлексии. И без рефлексии её прочитать.

Если у тебя все модели статические 100% и не предполагается расширение извне, т.е. ты работаешь с ORM, то ты можешь работать с классами. Но в ином случае, тебе нужно будет предоставить свой провайдер мета-модели, вместо работы с рефлексии напрямую.

У тебя нет ни абстрактного провайдера, ни динамической структуру для передачи данных (DataTable). Отсюда боль и страдания.


Antonariy
И проблема лишь в сраном антивирусе, которому не нравятся конкретные слова и буквы.


Ну антивирус это не единственная проблема. Всё решение -- проблема.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900677
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
попкорн у меня есть, жги.

Ну, пока что ты тут со своими проблемами (которые сам себе создал) о помощи просишь, а не я.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900678
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну антивирус это не единственная проблема. Всё решение -- проблема.

"Разруха проблема в головах".
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900699
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
И еще без кучи других клавиатурных сокращений.

У меня VsVim установлен екстеншеном, т.ч. шорткатов, наверное, поболее. Осталось только померить у кого шорткат длинее.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900701
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Да, кажется ты не понимаешь. DataRow может хранить любой кортеж, DataTable позволяет обратиться к модели данных, которую можно сконструировать в рантайме без рефлексии. И без рефлексии её прочитать.
Реально не понимаю, что такого плохого в рефлексии.

авторУ тебя нет ни абстрактного провайдера, ни динамической структуру для передачи данных (DataTable). Отсюда боль и страдания.Вот я и пытаюсь его запилить перебирая варианты.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900711
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Antonariy
попкорн у меня есть, жги.

Ну, пока что ты тут со своими проблемами (которые сам себе создал) о помощи просишь, а не я.
По пустым интерфейсам я помощи не просил, ты по собственной инициативе зачем-то вылез.
...
Рейтинг: 0 / 0
Сконструировать через Emit класс, реализущий заданный интерфейс
    #39900780
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
hVostt
Да, кажется ты не понимаешь. DataRow может хранить любой кортеж, DataTable позволяет обратиться к модели данных, которую можно сконструировать в рантайме без рефлексии. И без рефлексии её прочитать.
Реально не понимаю, что такого плохого в рефлексии.


Плохого ничего нет.
Но и хорошего.
Рефлексию используют не от хорошей архитектуры.


Antonariy
авторУ тебя нет ни абстрактного провайдера, ни динамической структуру для передачи данных (DataTable). Отсюда боль и страдания.
Вот я и пытаюсь его запилить перебирая варианты.

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


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