Создать экземпляр производного класса из экземпляра базового
От: Ules  
Дата: 18.04.13 07:13
Оценка:
Как это сделать с наименьшим геммороем? Не хочется вручную копировать все поля. Ничего не придумал лучше как использовать xml сериализацию с хаком. Есть ли более оптимальный/правильный путь?


         var writer = new StringWriter();
         var serializer = new XmlSerializer(typeof(MyBaseClass));
         serializer.Serialize(writer, prototype);
         var v = writer.ToString();

         v = v.Replace("MyBaseClass", "MyDerivedClass");
         var dserializer = new XmlSerializer(typeof(MyDerivedClass));
         var reader = new StringReader(v);
         var derivedObject = dserializer.Deserialize(reader);
Re: Создать экземпляр производного класса из экземпляра базового
От: hardcase Пират http://nemerle.org
Дата: 18.04.13 08:31
Оценка:
Здравствуйте, Ules, Вы писали:

U>Есть ли более оптимальный/правильный путь?


1) Чистая рефлексия: через рефлексию читаем поля, через нее же устанавливаем у другого объекта
2) Рефлексия + рантайм кодогенерация: через рефлексию читаем список полей, далее генерируем процедуру копирования данных.

Остается открытым вопрос: какое копирование использовать (глубокое или поверхностное)?
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Создать экземпляр производного класса из экземпляра базового
От: Tom Россия http://www.RSDN.ru
Дата: 18.04.13 09:16
Оценка:
U>Как это сделать с наименьшим геммороем? Не хочется вручную копировать все поля. Ничего не придумал лучше как использовать xml сериализацию с хаком. Есть ли более оптимальный/правильный путь?
Ы? Или я что то не так понял?

#1

    class Base<TDerived> where TDerived : new()
    {
        public TDerived NewTDerived()
        {
            return new TDerived();
        }
    }
    
    class Derived : Base<Derived>
    {
        
    }


#2

    abstract class Base<TDerived>
    {
        public abstract TDerived NewTDerived();
    }

    class Derived : Base<Derived>
    {
        public override Derived NewTDerived()
        {
            return new Derived();
        }
    }
Народная мудрось
всем все никому ничего(с).
Re[2]: Создать экземпляр производного класса из экземпляра базового
От: Ules  
Дата: 18.04.13 10:00
Оценка:
Здравствуйте, hardcase, Вы писали:

H>1) Чистая рефлексия: через рефлексию читаем поля, через нее же устанавливаем у другого объекта

H>2) Рефлексия + рантайм кодогенерация: через рефлексию читаем список полей, далее генерируем процедуру копирования данных.

H>Остается открытым вопрос: какое копирование использовать (глубокое или поверхностное)?


Требуется глубокое копирование. Этот способ наверное правильней чем мой, но хотелось бы избежать обхода полей.
Re[2]: Создать экземпляр производного класса из экземпляра базового
От: Ules  
Дата: 18.04.13 10:07
Оценка:
Tom>Ы? Или я что то не так понял?

Tom>#1


Tom>
Tom>    class Base<TDerived> where TDerived : new()
Tom>    {
Tom>        public TDerived NewTDerived()
Tom>        {
Tom>            return new TDerived();
Tom>        }
Tom>    }
    
Tom>    class Derived : Base<Derived>
Tom>    {
        
Tom>    }
Tom>

Tom>[/c#]

Эээ, если я правильно понял, это не то что мне нужно. Мне нужно создать производный экземпляр из базового так чтобы все его унаследованные поля были заполнены значениями базового экземпляра.
Т.е к примеру


  var baseObj = new BaseClass(someXml);
  var derivedObj = magicFunction(baseObj);  // функция создает производный экземпляр на основе базового



Еще ограничение — доступа к коду базового класса у меня нет.
Re[3]: Создать экземпляр производного класса из экземпляра базового
От: Tom Россия http://www.RSDN.ru
Дата: 18.04.13 10:36
Оценка:
U> Эээ, если я правильно понял, это не то что мне нужно. Мне нужно создать производный экземпляр из базового так чтобы все его унаследованные поля были заполнены значениями базового экземпляра.
U>Т.е к примеру
А в базовом классе копирование полей не реализовано вообще?
Народная мудрось
всем все никому ничего(с).
Re: Создать экземпляр производного класса из экземпляра базового
От: HowardLovekraft  
Дата: 18.04.13 10:57
Оценка:
Здравствуйте, Ules, Вы писали:

U>Как это сделать с наименьшим геммороем? Не хочется вручную копировать все поля

Используйте AutoMapper.
Re[4]: Создать экземпляр производного класса из экземпляра базового
От: Ules  
Дата: 18.04.13 11:21
Оценка:
Tom>А в базовом классе копирование полей не реализовано вообще?

нет
Re[2]: Создать экземпляр производного класса из экземпляра базового
От: Ules  
Дата: 18.04.13 11:22
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, Ules, Вы писали:


U>>Как это сделать с наименьшим геммороем? Не хочется вручную копировать все поля

HL>Используйте AutoMapper.
спасибо, но по мне это оверкилл, я уж лучше руками поля скопирую.
Re[3]: Создать экземпляр производного класса из экземпляра базового
От: HowardLovekraft  
Дата: 18.04.13 13:08
Оценка: 7 (2) +3
Здравствуйте, Ules, Вы писали:

U>спасибо, но по мне это оверкилл, я уж лучше руками поля скопирую.

Т.е., тормознутый XML-сериализатор с набором ограничений — не оверкилл, поддержка изменений при копировании полей/свойств руками — тоже не оверкилл, а использование штуки, предназначенной как раз для того, что вам нужно — оверкилл?
Я недоумеваю.
Re[4]: Создать экземпляр производного класса из экземпляра базового
От: Ules  
Дата: 18.04.13 15:49
Оценка:
хмм, наверное вы правы) Мне сериализатор тоже не нравится.
Re[3]: Создать экземпляр производного класса из экземпляра базового
От: Рек Россия  
Дата: 19.04.13 10:54
Оценка:
U> Еще ограничение — доступа к коду базового класса у меня нет.

А есть ли у вас доступ к коду, создающему экземпляры базового класса?
Re[4]: Создать экземпляр производного класса из экземпляра базового
От: Ules  
Дата: 19.04.13 12:26
Оценка:
тоже нет. Есть объект, который преобразует xml в экземпляры базового класса. Я эти объекты получаю и хочу на их основе генерировать объекты производного класса.
Re: Создать экземпляр производного класса из экземпляра базового
От: alexanderfedin США http://alexander-fedin.pixels.com/
Дата: 16.05.13 18:21
Оценка:
Здравствуйте, Ules, Вы писали:

U>Как это сделать с наименьшим геммороем? Не хочется вручную копировать все поля. Ничего не придумал лучше как использовать xml сериализацию с хаком. Есть ли более оптимальный/правильный путь?



U>
U>         var writer = new StringWriter();
U>         var serializer = new XmlSerializer(typeof(MyBaseClass));
U>         serializer.Serialize(writer, prototype);
U>         var v = writer.ToString();

U>         v = v.Replace("MyBaseClass", "MyDerivedClass");
U>         var dserializer = new XmlSerializer(typeof(MyDerivedClass));
U>         var reader = new StringReader(v);
U>         var derivedObject = dserializer.Deserialize(reader);
U>

AutoMapper
Respectfully,
Alexander Fedin.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.