Копирование свойств между объектами с использованием метода отражения и расширения - PullRequest
2 голосов
/ 05 августа 2011

Это мой код, в котором я создаю «копию» одного объекта (сущности) в пользовательский объект.
Он копирует только свойства с одинаковым именем как в исходном, так и в целевом объектах.

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

Например, пользовательский класс выглядит так:

public class CourseModel:BaseDataItemModel
{
    public int CourseNumber { get; set; }

    public string Name { get; set; }

    LecturerModel lecturer;

    [PropertySubEntity]
    public LecturerModel Lecturer
    {
        get { return lecturer; }
        set { lecturer = value; }
    }

    public CourseModel()
    {
         lecturer = new LecturerModel();
    }

 }

Проблема в строке targetProp.CopyPropertiesFrom(sourceProp);, когда я пытаюсь снова вызвать метод расширения (для копирования вложенного объекта), поскольку тип определяется во время выполнения, метод расширения не может быть решен во время компиляции.

Может быть, я что-то упустил ...

public static void CopyPropertiesFrom(this BaseDataItemModel targetObject, object source)
{
   PropertyInfo[] allProporties = source.GetType().GetProperties();
   PropertyInfo targetProperty;

   foreach (PropertyInfo fromProp in allProporties)
   {
      targetProperty = targetObject.GetType().GetProperty(fromProp.Name);
      if (targetProperty == null) continue;
      if (!targetProperty.CanWrite) continue;

     //check if property in target class marked with SkipProperty Attribute
     if (targetProperty.GetCustomAttributes(typeof(SkipPropertyAttribute), true).Length != 0) continue;

     if (targetProperty.GetCustomAttributes(typeof(PropertySubEntity), true).Length != 0)
     {
        //Type pType = targetProperty.PropertyType;
        var targetProp = targetProperty.GetValue(targetObject, null);
        var sourceProp = fromProp.GetValue(source, null);

        targetProp.CopyPropertiesFrom(sourceProp); // <== PROBLEM HERE
        //targetProperty.SetValue(targetObject, sourceEntity, null);

     }
       else
           targetProperty.SetValue(targetObject, fromProp.GetValue(source, null), null);
   }
}

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Сначала вам придется разыграть.

((BaseDataItemModel)targetProp).CopyPropertiesFrom(sourceProp); 
0 голосов
/ 05 августа 2011

Либо вам нужно привести targetProperty к BaseDataItemModel, чтобы вы могли вызвать для него метод расширения ( edit : как в ответе агента-j), либо в противном случае вы можете просто забыть об этой базеучебный класс.Зачем вашему алгоритму отражения это нужно?Он может работать с любым классом и направляется исключительно атрибутами атрибутов.

И если он работает с любым object, он не должен быть методом расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...