|
Конвертация классов
|
|||
---|---|---|---|
#18+
Добрый день, уважаемые знатоки :) Вообщем есть 4 класс: Код: 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.
и есть 4 зеркала на эти классы: Код: 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. 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. 65. 66. 67.
Получается дерево на картинке. Как конвертировать List<A> в List<ADescription>? Важна скорость конвертации. Объектов любого из этих классов может быть сотни, а то и тысячи. я не волшебник, я только учусь... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 17:12 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
ой, сорь за размер картинки...блин, когда сделают редактирования поста( ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 17:13 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
pyroman69когда сделают редактирования поста( 14254631 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 17:15 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
МСУpyroman69когда сделают редактирования поста( 14254631 хорошо, что добавят, но пока редактировать увы, нельзя ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 17:18 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
А может задачу имеет смысл решать с помощью наследования (интерфейсов)? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 17:40 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
МСУА может задачу имеет смысл решать с помощью наследования (интерфейсов)? Я об этом думал. Но! Первые 4 класса - это сущности NHibernate, там все св-ва виртуальные, а вторые 4 класса - это контракты WCF. Я не представляю как их можно объединить интерфейсом ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 17:50 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
pyroman69, мсу прально говорит, в вашем случае преобразование будет через new, тут как ни крути с комбинаторикой создания " а то и тысячи." тормоза очевидны, тем более заполнения листов при больших масштабах( или выделение памяти сразу по размеру, или пересоздания массива при добавлении) все одно медленно ... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 17:54 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
Где-то в степиpyroman69, мсу прально говорит, в вашем случае преобразование будет через new, тут как ни крути с комбинаторикой создания " а то и тысячи." тормоза очевидны, тем более заполнения листов при больших масштабах( или выделение памяти сразу по размеру, или пересоздания массива при добавлении) все одно медленно ... я все это понимаю, но как я писал выше, одни классы - это данные из БД, другие - это контракты. Если вводить интерфейсы, то метод WCF должны будут возвращать тип интерфейс, что насколько я знаю, невозможно. Т.о. нужна конвертация в любом случае. Вообщем пока подумаю об альтернативе ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 18:30 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
pyroman69МСУА может задачу имеет смысл решать с помощью наследования (интерфейсов)? Я об этом думал. Но! Первые 4 класса - это сущности NHibernate, там все св-ва виртуальные, а вторые 4 класса - это контракты WCF. Я не представляю как их можно объединить интерфейсом вообще говоря это разные сущности, поэтому имхо "приведение" тут недопустимый термин. Либо делать типа wcf data service, где то что получил из бд есть контракт. Разве [datamember] будет мешать работать NH? ЗЫ и зачем вам вообще NH? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 18:30 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
pyroman69, Ну не вдаваясь в ваши проблемы, вы работаете со списком A зачем вам общая конвертация всего списка в какой то другой, достаточно вытащить экземпляр итема и получить его отражение class A:IProxsy<ADescription> {} ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 18:40 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
netivanpyroman69пропущено... Я об этом думал. Но! Первые 4 класса - это сущности NHibernate, там все св-ва виртуальные, а вторые 4 класса - это контракты WCF. Я не представляю как их можно объединить интерфейсом вообще говоря это разные сущности, поэтому имхо "приведение" тут недопустимый термин. Либо делать типа wcf data service, где то что получил из бд есть контракт. Разве [datamember] будет мешать работать NH? ЗЫ и зачем вам вообще NH? наследовать один интерфейс от другого ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 18:46 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
Где-то в степиpyroman69, Ну не вдаваясь в ваши проблемы, вы работаете со списком A зачем вам общая конвертация всего списка в какой то другой, достаточно вытащить экземпляр итема и получить его отражение class A:IProxsy<ADescription> {} Я же пояснил. Класс А - это сущность NH, сво-ва как и листы внутри заполняются автоматом, согласно мапингу. Я думаю, Вы понимаете о чем я. Но клиенту я должен отдать объект другого класса - контракта. Вот и возникла необходимость конвертации. Интерфейсы не подходят. Но похоже, что проблема решилась. Сделал как посоветовал netivan, точнее попробовал чуть раньше, чем прочитал. Убрал первые классы, контракты привязал к мапингу. Вроде прокатило. Сейчас придется переписать кучу классов, но оно того стоит. Вообщем всем спасибо, натолкнули на путь истинный ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 19:02 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
pyroman69, очень хорошо что нашли авторЯ же пояснил. Класс А - это сущность NH, сво-ва как и листы внутри заполняются автоматом, согласно мапингу. Я думаю, Вы понимаете о чем я. это проекции ваших таблиц, ничего крамольного тут нет если вы в будущем будете прикручивать к ним интерфейс хибру глубоко плевать на это, основное требование, что бы рабочие методы были виртуальны и присутствовал ctor. по умолчанию сам хибер работает с прокси а не вашими классами, почему виртуальны потому что в тело акцессоров и мутаторов зашивается механизм нотификации, а что вы подкладываете для создания прокси ему глубоко плевать ибо в DefineType третьем параметре ваш тип A, а сами навороты в прокси хибера идут через AddInterfaceImplementation и кстати не одиночно, так что если вы в свой мап прикрутите интерфейс, он будет виден в прокси хибера.Но в реализации не стоит забывать про DefineMethodOverride ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 19:26 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
Как правильно заметили, тут неприемлем термин приведение. Если не устраивает интерфейсная зависимость, то остаются только мапперы. Вариантов много, вот у меня тут в сборнике 4 штуки: Мапперы ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 22:38 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
МСУ, Наконец то догадался в один раздел собрать, намедни рылся все по разным местам понатыкано.. Вот подскажи, Алексей K тут на форуме давненько выкидывал код с емитами мапа, что то там мне понравилось, а вот найти не смог может ты помнишь? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2013, 23:11 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
Где-то в степиможет ты помнишь? Конечно помню, вот он лежит: Emit property set-get value ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 09:13 |
|
Конвертация классов
|
|||
---|---|---|---|
#18+
Где-то в степиpyroman69, очень хорошо что нашли авторЯ же пояснил. Класс А - это сущность NH, сво-ва как и листы внутри заполняются автоматом, согласно мапингу. Я думаю, Вы понимаете о чем я. это проекции ваших таблиц, ничего крамольного тут нет если вы в будущем будете прикручивать к ним интерфейс хибру глубоко плевать на это, основное требование, что бы рабочие методы были виртуальны и присутствовал ctor. по умолчанию сам хибер работает с прокси а не вашими классами, почему виртуальны потому что в тело акцессоров и мутаторов зашивается механизм нотификации, а что вы подкладываете для создания прокси ему глубоко плевать ибо в DefineType третьем параметре ваш тип A, а сами навороты в прокси хибера идут через AddInterfaceImplementation и кстати не одиночно, так что если вы в свой мап прикрутите интерфейс, он будет виден в прокси хибера.Но в реализации не стоит забывать про DefineMethodOverride да с хибернейтом нет проблем. Но реализуя задачу через интерфейсы, мне надо будет классы-контракты наследовать от этих интерфейсов. И реализовывая потом методы, тип возвращаемых значений так же менять на интерфейсы. А WCF не позволяет этого. МСУ, спасибо, посмотрю, что у Вас там. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2013, 11:48 |
|
|
start [/forum/topic.php?fid=20&msg=38406434&tid=1403983]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 161ms |
0 / 0 |