Как скопировать значения своств с одного объекта в другой
От: Аноним  
Дата: 07.10.10 12:09
Оценка:
Добрый день, я плохо знаю рефлеклектион, поэтому прощу помощи. Есть 2 класса

class classA
{
public string Prop1 {get;set;}
public int Prop2 {get;set;}
public InitFromB(classB b);
{
//Тут необходимо скопировать значения public свойств по имени из b в текущий объект
}
}

class classB
{
public string Prop1 {get;set;}
public int Prop2 {get;set;}
}

Как такое сделать на C#?
Re: Как скопировать значения своств с одного объекта в друг
От: LF  
Дата: 07.10.10 12:19
Оценка:
А>Как такое сделать на C#?
AutoMapper
EmitMapper
Re[2]: Как скопировать значения своств с одного объекта в д
От: Аноним  
Дата: 07.10.10 12:25
Оценка:
Здравствуйте, LF, Вы писали:

А>>Как такое сделать на C#?

LF>AutoMapper
LF>EmitMapper

Это сложное для меня. А нельзя ли что нить попроще? Мне не нужно глубокое копирование. Достаточно только public свойства простых типов (числа, символы, строки)


П.С. На будущее хочу узнать что более функциональное и быстрое: AutoMapper или EmitMapper
Re[3]: Как скопировать значения своств с одного объекта в д
От: LF  
Дата: 07.10.10 12:31
Оценка:
А>Это сложное для меня. А нельзя ли что нить попроще? Мне не нужно глубокое копирование. Достаточно только public свойства простых типов (числа, символы, строки)
Самое простое взять готовый компонент, чем городить свой велосипед.

А>П.С. На будущее хочу узнать что более функциональное и быстрое: AutoMapper или EmitMapper

Вроде как EmitMapper, но AutoMapper тоже работает неплохо.
Re[4]: Как скопировать значения своств с одного объекта в д
От: shakm Россия  
Дата: 07.10.10 12:52
Оценка:
Здравствуйте, LF, Вы писали:

А>>Это сложное для меня. А нельзя ли что нить попроще? Мне не нужно глубокое копирование. Достаточно только public свойства простых типов (числа, символы, строки)

LF>Самое простое взять готовый компонент, чем городить свой велосипед.

А>>П.С. На будущее хочу узнать что более функциональное и быстрое: AutoMapper или EmitMapper

LF>Вроде как EmitMapper, но AutoMapper тоже работает неплохо.

Ну вроде бы свой велосипед достаточно простой, вот на такой пример на .Net 2.0 ушло несколько минут. Недавно делал себе такое.


        static class ObjectCopy
        {
            internal static void Copy(object source, object destination)
            {
                PropertyInfo[] propListSrc = source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
                List<PropertyInfo> propListDest = new List<PropertyInfo>(destination.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public));
                PropertyInfo propDest;
                foreach (PropertyInfo propSrc in propListSrc)
                {
                    if ((propDest = propListDest.Find(new Predicate<PropertyInfo>(delegate(PropertyInfo prop)
                    {
                        return prop.Name.Equals(propSrc.Name, StringComparison.CurrentCultureIgnoreCase); 
                    }))) != null)
                        propDest.SetValue(destination, propSrc.GetValue(source, null), null);
                }
            }
        }

        class classA
        {
            string _Prop1 = "classA.Prop1";
            int _Prop2 = -1;
            public string Prop1 { get { return _Prop1; } set { _Prop1 = value; } }
            public int Prop2 { get { return _Prop2; } set { _Prop2 = value; } }
            public override string ToString()
            {
                return String.Format("classA. Prop1: {0}, Prop2: {1}", Prop1, Prop2);
            }
        }

        class classB
        {
            string _Prop1 = "classb.Prop1";
            int _Prop2 = 10000000;
            public string Prop1 { get { return _Prop1; } set { _Prop1 = value; } }
            public int Prop2 { get { return _Prop2; } set { _Prop2 = value; } }
            public override string ToString()
            {
                return String.Format("classB. Prop1: {0}, Prop2: {1}", Prop1, Prop2);
            }
        }

        static void Main(string[] args)
        {
            classA a = new classA();
            classB b = new classB();
            Console.WriteLine(a);
            Console.WriteLine(b);
            Console.WriteLine("After copy:");
            ObjectCopy.Copy(a, b);
            Console.WriteLine(b);
            Console.ReadLine();
        }
Re[4]: Как скопировать значения своств с одного объекта в д
От: Аноним  
Дата: 07.10.10 13:14
Оценка:
А>>П.С. На будущее хочу узнать что более функциональное и быстрое: AutoMapper или EmitMapper
LF>Вроде как EmitMapper, но AutoMapper тоже работает неплохо.

А как юзать EmitMapper если классы объектов не известны. Вот пример

var mapper = ObjectMapperManager.DefaultInstance.GetMapper<BenchSource, BenchDestination>();
var s = new BenchSource();
var d = new BenchDestination();
mapper.Map(s, d);

А если типы я не знаю а имею только ссылки на объекты?
Re[5]: Как скопировать значения своств с одного объекта в д
От: Аноним  
Дата: 07.10.10 13:21
Оценка:
S>Ну вроде бы свой велосипед достаточно простой, вот на такой пример на .Net 2.0 ушло несколько минут. Недавно делал себе такое.


S>
S>        static class ObjectCopy
S>        {
S>            internal static void Copy(object source, object destination)
S>            {
S>                PropertyInfo[] propListSrc = source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
S>                List<PropertyInfo> propListDest = new List<PropertyInfo>(destination.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public));
S>                PropertyInfo propDest;
S>                foreach (PropertyInfo propSrc in propListSrc)
S>                {
S>                    if ((propDest = propListDest.Find(new Predicate<PropertyInfo>(delegate(PropertyInfo prop)
S>                    {
S>                        return prop.Name.Equals(propSrc.Name, StringComparison.CurrentCultureIgnoreCase); 
S>                    }))) != null)
S>                        propDest.SetValue(destination, propSrc.GetValue(source, null), null);
S>                }
S>            }
S>        }

S>        class classA
S>        {
S>            string _Prop1 = "classA.Prop1";
S>            int _Prop2 = -1;
S>            public string Prop1 { get { return _Prop1; } set { _Prop1 = value; } }
S>            public int Prop2 { get { return _Prop2; } set { _Prop2 = value; } }
S>            public override string ToString()
S>            {
S>                return String.Format("classA. Prop1: {0}, Prop2: {1}", Prop1, Prop2);
S>            }
S>        }

S>        class classB
S>        {
S>            string _Prop1 = "classb.Prop1";
S>            int _Prop2 = 10000000;
S>            public string Prop1 { get { return _Prop1; } set { _Prop1 = value; } }
S>            public int Prop2 { get { return _Prop2; } set { _Prop2 = value; } }
S>            public override string ToString()
S>            {
S>                return String.Format("classB. Prop1: {0}, Prop2: {1}", Prop1, Prop2);
S>            }
S>        }

S>        static void Main(string[] args)
S>        {
S>            classA a = new classA();
S>            classB b = new classB();
S>            Console.WriteLine(a);
S>            Console.WriteLine(b);
S>            Console.WriteLine("After copy:");
S>            ObjectCopy.Copy(a, b);
S>            Console.WriteLine(b);
S>            Console.ReadLine();
S>        }

S>



Думаю стоит дописать строка
if(propDest.CanWrite)
propDest.SetValue(destination, propSrc.GetValue(source, null), null);
Re[5]: Как скопировать значения своств с одного объекта в д
От: LF  
Дата: 07.10.10 13:23
Оценка:
А>А если типы я не знаю а имею только ссылки на объекты?
есть метод GetType() у каждого объекта.
Re[6]: Как скопировать значения своств с одного объекта в д
От: Аноним  
Дата: 07.10.10 13:27
Оценка:
Здравствуйте, LF, Вы писали:

А>>А если типы я не знаю а имею только ссылки на объекты?

LF>есть метод GetType() у каждого объекта.

А как его передать в качестве параметра в конструктор Мепера?
Re[7]: Как скопировать значения своств с одного объекта в д
От: LF  
Дата: 07.10.10 13:40
Оценка:
А>А как его передать в качестве параметра в конструктор Мепера?
Надо использовать метод
public ObjectsMapperBaseImpl GetMapperImpl(Type from, Type to, IMappingConfigurator mappingConfigurator)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.