Как это сделать с наименьшим геммороем? Не хочется вручную копировать все поля. Ничего не придумал лучше как использовать 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: Создать экземпляр производного класса из экземпляра базового
Здравствуйте, Ules, Вы писали:
U>Есть ли более оптимальный/правильный путь?
1) Чистая рефлексия: через рефлексию читаем поля, через нее же устанавливаем у другого объекта
2) Рефлексия + рантайм кодогенерация: через рефлексию читаем список полей, далее генерируем процедуру копирования данных.
Остается открытым вопрос: какое копирование использовать (глубокое или поверхностное)?
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Создать экземпляр производного класса из экземпляра базового
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]: Создать экземпляр производного класса из экземпляра базового
Здравствуйте, hardcase, Вы писали:
H>1) Чистая рефлексия: через рефлексию читаем поля, через нее же устанавливаем у другого объекта H>2) Рефлексия + рантайм кодогенерация: через рефлексию читаем список полей, далее генерируем процедуру копирования данных.
H>Остается открытым вопрос: какое копирование использовать (глубокое или поверхностное)?
Требуется глубокое копирование. Этот способ наверное правильней чем мой, но хотелось бы избежать обхода полей.
Re[2]: Создать экземпляр производного класса из экземпляра базового
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]: Создать экземпляр производного класса из экземпляра базового
U> Эээ, если я правильно понял, это не то что мне нужно. Мне нужно создать производный экземпляр из базового так чтобы все его унаследованные поля были заполнены значениями базового экземпляра. U>Т.е к примеру
А в базовом классе копирование полей не реализовано вообще?
Народная мудрось
всем все никому ничего(с).
Re: Создать экземпляр производного класса из экземпляра базового
Здравствуйте, HowardLovekraft, Вы писали:
HL>Здравствуйте, Ules, Вы писали:
U>>Как это сделать с наименьшим геммороем? Не хочется вручную копировать все поля HL>Используйте AutoMapper.
спасибо, но по мне это оверкилл, я уж лучше руками поля скопирую.
Re[3]: Создать экземпляр производного класса из экземпляра базового
Здравствуйте, Ules, Вы писали:
U>спасибо, но по мне это оверкилл, я уж лучше руками поля скопирую.
Т.е., тормознутый XML-сериализатор с набором ограничений — не оверкилл, поддержка изменений при копировании полей/свойств руками — тоже не оверкилл, а использование штуки, предназначенной как раз для того, что вам нужно — оверкилл?
Я недоумеваю.
Re[4]: Создать экземпляр производного класса из экземпляра базового
тоже нет. Есть объект, который преобразует xml в экземпляры базового класса. Я эти объекты получаю и хочу на их основе генерировать объекты производного класса.
Re: Создать экземпляр производного класса из экземпляра базового
Здравствуйте, 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>