Установка свойств объекта из другого объекта через отражение - PullRequest
0 голосов
/ 11 января 2011

Итак, в основном я искал способ клонировать объект и скопировать его свойства, а затем добавить его. Кажется глупым создавать класс, наследовать существующий объект, затем иметь кучу this.prop = obj.prop;

Я подумал, что может быть простой способ сделать это с помощью отражения и циклического просмотра свойств obj для установки свойств this. Мысли

Ответы [ 4 ]

3 голосов
/ 12 января 2011

Да, вы можете сделать это с отражением:

http://wraithnath.blogspot.com/2011/01/how-to-copy-and-object-with-reflection.html

                    //Copy the properties
                foreach ( PropertyInfo oPropertyInfo in oCostDept.GetType().GetProperties() )
                {
                    //Check the method is not static
                    if ( !oPropertyInfo.GetGetMethod().IsStatic )
                    {
                        //Check this property can write
                        if ( this.GetType().GetProperty( oPropertyInfo.Name ).CanWrite )
                        {
                            //Check the supplied property can read
                            if ( oPropertyInfo.CanRead )
                            {
                                //Update the properties on this object
                                this.GetType().GetProperty( oPropertyInfo.Name ).SetValue( this, oPropertyInfo.GetValue( oCostDept, null ), null );
                            }
                        }
                    }
                }

[1]: http://wraithnath.blogspot.com/2011/01/how-to-copy-and-object-with-reflection.html "

1 голос
/ 11 января 2011

Все зависит от того, какой тип клонирования вы хотите. Если вы хотите мелкое клонирование, это достаточно просто. Перебирая свойства объекта и устанавливая их на клоне, мы это сделаем. Но это означает, что свойства, содержащие ссылки, будут ссылаться на один и тот же объект как для источника, так и для клона.

Если вы хотите глубокое клонирование, вам нужно будет найти способ также клонировать ссылки, принадлежащие исходному объекту (и ссылки, принадлежащие ссылкам, принадлежащим источнику и т. Д. И т. Д.). Это может быть невозможно сделать автоматически, если эти ссылки не имеют конструкторов по умолчанию.

Что сводится к тому, что, по моему опыту, если у вас есть нетривиальный класс и / или иерархия классов (особенно с возможностью несуществующих конструкторов по умолчанию), самый простой и надежный способ - это просто напишите либо «конструктор копирования» (который не существует как таковой в .NET), и выполняйте работу самостоятельно, реализуйте ICloneable и выполняйте работу самостоятельно, либо реализуйте свой собственный метод Clone, и выполняйте работай сам;)

1 голос
/ 11 января 2011

Вы можете взглянуть на AutoMapper .

0 голосов
/ 12 января 2011

Если классы сериализуемы, вы, вероятно, могли бы использовать XML-сериализацию для сериализации одного класса, а затем десериализации другого.

...