Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Конвертация классов / 18 сообщений из 18, страница 1 из 1
24.09.2013, 17:12
    #38406373
pyroman69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
Добрый день, уважаемые знатоки :)
Вообщем есть 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.
class A
{
    public int Id { get; set; }
    public System.Collections.Generic.List<B> BItems { get; set; }
}

class B
{
    public int Id { get; set; }
    public A Parent { get; set; }
    public System.Collections.Generic.List<C> CItems { get; set; }
}

class C
{
    public int Id { get; set; }
    public B Parent { get; set; }
    public System.Collections.Generic.List<D> DItems { get; set; }
}

class D
{
    public int Id { get; set; }
    public int Type { get; set; }
    public C Reference { get; set; }
    public C Parent { get; set; }
}


и есть 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.
class ADescription
{
    public int Id { get; set; }
    public System.Collections.Generic.List<BDescription> BDescriptionItems { get; set; }
}

class BDescription
{
    public int Id { get; set; }
    public ADescription Parent { get; set; }
    public System.Collections.Generic.List<CDescription> CDescriptionItems { get; set; }
}

class CDescription
{
    public int Id { get; set; }
    public BDescription Parent { get; set; }
    public System.Collections.Generic.List<DDescription> DDescriptionItems { get; set; }
}

class DDescription
{
    public int Id { get; set; }
    public int Type { get; set; }
    public CDescription Reference { get; set; }
    public CDescription Parent { get; set; }
}


Есть небольшое заполнение, для теста накидал:
Код: 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> aList = new List<A>();
A a = new A()
{
    Id = 1,
    BItems = new System.Collections.Generic.List<B>()
};

B b = new B()
{
    Id = 11,
    Parent = a,
    CItems = new System.Collections.Generic.List<C>()
};
a.BItems.Add(b);

C c = new C() 
{
    Id = 111,
    Parent = b,
    DItems = new System.Collections.Generic.List<D>()
};
c.DItems.Add(new D() 
{ 
    Id = 1111, 
    Parent = c
});
c.DItems.Add(new D()
{
    Id = 1112,
    Parent = c
});            
b.CItems.Add(c);
            

b = new B()
{
    Id = 12,
    Parent = a,
    CItems = new System.Collections.Generic.List<C>()
};
a.BItems.Add(b);

b = new B()
{
    Id = 13,
    Parent = a,
    CItems = new System.Collections.Generic.List<C>()
};
a.BItems.Add(b);
            
c = new C()
{
    Id = 131,
    Parent = b,
    DItems = new System.Collections.Generic.List<D>()
};
b.CItems.Add(c);
c = new C()
{
    Id = 132,
    Parent = b,
    DItems = new System.Collections.Generic.List<D>()
};
b.CItems.Add(c);

a.BItems[0].CItems[0].DItems[0].Reference = c;
aList.Add(a);



Получается дерево на картинке.
Как конвертировать List<A> в List<ADescription>? Важна скорость конвертации. Объектов любого из этих классов может быть сотни, а то и тысячи.
я не волшебник, я только учусь...
...
Рейтинг: 0 / 0
24.09.2013, 17:13
    #38406375
pyroman69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
ой, сорь за размер картинки...блин, когда сделают редактирования поста(
...
Рейтинг: 0 / 0
24.09.2013, 17:15
    #38406380
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
pyroman69когда сделают редактирования поста(
14254631
...
Рейтинг: 0 / 0
24.09.2013, 17:18
    #38406385
pyroman69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
МСУpyroman69когда сделают редактирования поста(
14254631
хорошо, что добавят, но пока редактировать увы, нельзя
...
Рейтинг: 0 / 0
24.09.2013, 17:40
    #38406417
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
А может задачу имеет смысл решать с помощью наследования (интерфейсов)?
...
Рейтинг: 0 / 0
24.09.2013, 17:50
    #38406434
pyroman69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
МСУА может задачу имеет смысл решать с помощью наследования (интерфейсов)?
Я об этом думал. Но! Первые 4 класса - это сущности NHibernate, там все св-ва виртуальные, а вторые 4 класса - это контракты WCF. Я не представляю как их можно объединить интерфейсом
...
Рейтинг: 0 / 0
24.09.2013, 17:54
    #38406441
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
pyroman69,
мсу прально говорит, в вашем случае преобразование будет через new, тут как ни крути с комбинаторикой создания
" а то и тысячи." тормоза очевидны, тем более заполнения листов при больших масштабах( или выделение памяти сразу по размеру, или пересоздания массива при добавлении) все одно медленно ...
...
Рейтинг: 0 / 0
24.09.2013, 18:30
    #38406472
pyroman69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
Где-то в степиpyroman69,
мсу прально говорит, в вашем случае преобразование будет через new, тут как ни крути с комбинаторикой создания
" а то и тысячи." тормоза очевидны, тем более заполнения листов при больших масштабах( или выделение памяти сразу по размеру, или пересоздания массива при добавлении) все одно медленно ...
я все это понимаю, но как я писал выше, одни классы - это данные из БД, другие - это контракты. Если вводить интерфейсы, то метод WCF должны будут возвращать тип интерфейс, что насколько я знаю, невозможно. Т.о. нужна конвертация в любом случае. Вообщем пока подумаю об альтернативе
...
Рейтинг: 0 / 0
24.09.2013, 18:30
    #38406473
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
pyroman69МСУА может задачу имеет смысл решать с помощью наследования (интерфейсов)?
Я об этом думал. Но! Первые 4 класса - это сущности NHibernate, там все св-ва виртуальные, а вторые 4 класса - это контракты WCF. Я не представляю как их можно объединить интерфейсом
вообще говоря это разные сущности, поэтому имхо "приведение" тут недопустимый термин.
Либо делать типа wcf data service, где то что получил из бд есть контракт. Разве [datamember] будет мешать работать NH?
ЗЫ
и зачем вам вообще NH?
...
Рейтинг: 0 / 0
24.09.2013, 18:40
    #38406483
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
pyroman69,
Ну не вдаваясь в ваши проблемы, вы работаете со списком A зачем вам общая конвертация всего списка в какой то другой, достаточно
вытащить экземпляр итема и получить его отражение
class A:IProxsy<ADescription> {}
...
Рейтинг: 0 / 0
24.09.2013, 18:46
    #38406489
VIT2708
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
netivanpyroman69пропущено...

Я об этом думал. Но! Первые 4 класса - это сущности NHibernate, там все св-ва виртуальные, а вторые 4 класса - это контракты WCF. Я не представляю как их можно объединить интерфейсом
вообще говоря это разные сущности, поэтому имхо "приведение" тут недопустимый термин.
Либо делать типа wcf data service, где то что получил из бд есть контракт. Разве [datamember] будет мешать работать NH?
ЗЫ
и зачем вам вообще NH?

наследовать один интерфейс от другого
...
Рейтинг: 0 / 0
24.09.2013, 19:02
    #38406513
pyroman69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
Где-то в степиpyroman69,
Ну не вдаваясь в ваши проблемы, вы работаете со списком A зачем вам общая конвертация всего списка в какой то другой, достаточно
вытащить экземпляр итема и получить его отражение
class A:IProxsy<ADescription> {}
Я же пояснил. Класс А - это сущность NH, сво-ва как и листы внутри заполняются автоматом, согласно мапингу. Я думаю, Вы понимаете о чем я. Но клиенту я должен отдать объект другого класса - контракта. Вот и возникла необходимость конвертации. Интерфейсы не подходят. Но похоже, что проблема решилась. Сделал как посоветовал netivan, точнее попробовал чуть раньше, чем прочитал. Убрал первые классы, контракты привязал к мапингу. Вроде прокатило. Сейчас придется переписать кучу классов, но оно того стоит.
Вообщем всем спасибо, натолкнули на путь истинный
...
Рейтинг: 0 / 0
24.09.2013, 19:26
    #38406536
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
pyroman69,
очень хорошо что нашли
авторЯ же пояснил. Класс А - это сущность NH, сво-ва как и листы внутри заполняются автоматом, согласно мапингу. Я думаю, Вы понимаете о чем я.
это проекции ваших таблиц, ничего крамольного тут нет если вы в будущем будете прикручивать к ним интерфейс
хибру глубоко плевать на это, основное требование, что бы рабочие методы были виртуальны и присутствовал ctor. по умолчанию
сам хибер работает с прокси а не вашими классами, почему виртуальны
потому что в тело акцессоров и мутаторов зашивается механизм нотификации, а что вы подкладываете для создания прокси ему глубоко плевать ибо в DefineType третьем параметре ваш тип A, а сами навороты в прокси хибера идут через AddInterfaceImplementation и кстати не одиночно, так что если вы в свой мап
прикрутите интерфейс, он будет виден в прокси хибера.Но в реализации не стоит забывать про DefineMethodOverride
...
Рейтинг: 0 / 0
24.09.2013, 22:38
    #38406626
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
Как правильно заметили, тут неприемлем термин приведение. Если не устраивает интерфейсная зависимость, то остаются только мапперы. Вариантов много, вот у меня тут в сборнике 4 штуки: Мапперы
...
Рейтинг: 0 / 0
24.09.2013, 23:11
    #38406641
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
МСУ,
Наконец то догадался в один раздел собрать, намедни рылся все по разным местам понатыкано..
Вот подскажи, Алексей K тут на форуме давненько выкидывал код с емитами мапа, что то там мне понравилось, а вот найти не смог
может ты помнишь?
...
Рейтинг: 0 / 0
25.09.2013, 09:13
    #38406783
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
Где-то в степиможет ты помнишь?
Конечно помню, вот он лежит: Emit property set-get value
...
Рейтинг: 0 / 0
25.09.2013, 11:48
    #38407007
pyroman69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
Где-то в степиpyroman69,
очень хорошо что нашли
авторЯ же пояснил. Класс А - это сущность NH, сво-ва как и листы внутри заполняются автоматом, согласно мапингу. Я думаю, Вы понимаете о чем я.
это проекции ваших таблиц, ничего крамольного тут нет если вы в будущем будете прикручивать к ним интерфейс
хибру глубоко плевать на это, основное требование, что бы рабочие методы были виртуальны и присутствовал ctor. по умолчанию
сам хибер работает с прокси а не вашими классами, почему виртуальны
потому что в тело акцессоров и мутаторов зашивается механизм нотификации, а что вы подкладываете для создания прокси ему глубоко плевать ибо в DefineType третьем параметре ваш тип A, а сами навороты в прокси хибера идут через AddInterfaceImplementation и кстати не одиночно, так что если вы в свой мап
прикрутите интерфейс, он будет виден в прокси хибера.Но в реализации не стоит забывать про DefineMethodOverride
да с хибернейтом нет проблем. Но реализуя задачу через интерфейсы, мне надо будет классы-контракты наследовать от этих интерфейсов. И реализовывая потом методы, тип возвращаемых значений так же менять на интерфейсы. А WCF не позволяет этого.
МСУ, спасибо, посмотрю, что у Вас там.
...
Рейтинг: 0 / 0
25.09.2013, 12:12
    #38407034
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация классов
а что мапперы? они что, новые объекты не создают чтоли?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Конвертация классов / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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