2011-10-15 2 views
2

1에서 상속 된 class1을 정의했습니다. class1과 같은 simila 멤버가 있지만 class2에서 상속 된 다른 클래스 2도 정의했습니다.필드로 객체 필드 복사

어떻게 class1을 Class2로 변환 할 수 있습니까?

하나의 옵션은 내가 .NET에서 더 좋은 대안은 있는가

Class2.a = Class1.a; 
Class2.b = Class1.b; 
Class2.c = Class1.c; 

처럼 한 번에 하나 개의 속성을 할당해야합니까?

+0

공용 인터페이스를 공유하지 않는 한 3 가지 옵션, 1) 한 번에 한 줄의 세 가지 옵션이 있습니다. 2) Automapper (사용하기 쉽고 매우 유연함)와 같은 도구를 사용하십시오. 3) reflection을 사용하십시오. –

+0

@ Gary.S 동일한 인터페이스를 구현한다면 무엇이 바뀔까요? 내가 본 것처럼, 당신은 여전히 ​​똑같은 3 가지 옵션을가집니다. –

+0

그들이 동일한 인터페이스를 구현하는 경우 구체적인 구현보다는 주변 인터페이스를 사용할 수 있습니다. 필요한 속성을 사용하여 의존 할 수있는 경우 매핑 할 필요가 없습니다. –

답변

3

서로 다른 종류의 많은 사이에 그것을 할 수있는 경우는 AutoMapper

2

현재 솔루션을 완벽하게 수용하고

B.

을 반대하는 매핑 객체 A의 매우 명시 적 방법 사용을 고려할 수있는 대부분의 AutoMapper과 같은 매핑 라이브러리는 규칙 기반 매핑을 허용합니다. 속성 이름과 유형이 정렬되면 구성을 거의 필요로하지 않고지도에 표시됩니다. 대상 객체의 유사성에 따라이 방법을 사용하면 작업을 수행해야 할 수도 있습니다. 단점은 명시 적이지 않으며 수동 구성의 양에 따라 복잡성을 추가하는 것일 수도 있습니다. 좋아

public static class ExtendedClassPropMapping 
{ 
    public static Y MapTo<T, Y>(this T input) where Y : class, new() 
    { 
     Y output = new Y(); 
     var propsT = typeof(T).GetProperties(); 
     var propsY = typeof(Y).GetProperties(); 

     var similarsT = propsT.Where(x => 
         propsY.Any(y => y.Name == x.Name 
       && y.PropertyType == x.PropertyType)).OrderBy(x=>x.Name).ToList(); 

     var similarsY = propsY.Where(x=> 
         propsT.Any(y=>y.Name == x.Name 
       && y.PropertyType == x.PropertyType)).OrderBy(x=>x.Name).ToList(); 

     for (int i=0;i<similarsY.Count;i++) 
     { 
      similarsY[i] 
      .SetValue(output, similarsT[i].GetValue(input, null), null); 
     } 

     return output; 
    } 
} 

및 사용 :

var test = firstObject.MapTo<class1, class2>(); 
4

당신은 같은 우는 소리, 자신의 확장 방법을 쓸 수 있습니다 사용하고 읽어

public static class ExtendedClassPropMapping 
{ 
    public static Y MapTo<Y>(this object input) where Y : class, new() 
    { 
     Y output = new Y(); 
     var propsT = input.GetType().GetProperties(); 
     var propsY = typeof(Y).GetProperties(); 

     var similarsT = propsT.Where(x => 
         propsY.Any(y => y.Name == x.Name 
       && y.PropertyType == x.PropertyType)).OrderBy(x => x.Name).ToList(); 

     var similarsY = propsY.Where(x => 
         propsT.Any(y => y.Name == x.Name 
       && y.PropertyType == x.PropertyType)).OrderBy(x => x.Name).ToList(); 

     for (int i = 0; i < similarsY.Count; i++) 
     { 
      similarsY[i] 
      .SetValue(output, similarsT[i].GetValue(input, null), null); 
     } 

     return output; 
    } 

    public static T MapNew<T>(this T input) where T : class, new() 
    { 
     T output = new T(); 

     var similarsT = input.GetType().GetProperties().OrderBy(x => x.Name).ToList(); 
     var similarsY = output.GetType().GetProperties().OrderBy(x => x.Name).ToList(); 

     for (int i = 0; i < similarsY.Count; i++) 
     { 
      similarsY[i] 
      .SetValue(output, similarsT[i].GetValue(input, null), null); 
     } 

     return output; 
    } 
} 

는 그런 다음과 같이 사용할 수 있습니다 :

,
public Teacher ConvertInterfaceToClass(ITeacher teacher) 
{ 
    return teacher.MapTo<Teacher>(); 
} 

public void CopyTeacher(Teacher source, out Teacher destination) 
{ 
    destination = source.MapTo<Teacher>(); 
} 
+0

이 방법을 사용하지 않는 것이 좋습니다. Automapper는 훨씬 더 강력한 솔루션이 될 것입니다. 규칙이 훨씬 많아서 il emit을 사용하는 사용자 정의 디시리얼라이저를 생성하므로 훨씬 빠릅니다. –

+0

@ Yannick Motton, 내 코드에서 성능 저하를 볼 수 없으며, OP에 대해 반사와 몇 가지 간단한 규칙을 사용하여 원하는 작업을 수행하는 것이 좋습니다. 코드가 어렵지 않습니다. 개인적으로 이 코드를 사용하여 제 프로젝트 라이브러리에 제 3 자 라이브러리를 추가하는 대신 간단한 문제가 있습니다. –

+0

반사 *가 병목입니다. 제 3 자 라이브러리에서 수행하는 종속성을 최소화한다는 아이디어에 동의하지만,이를 재발견하는 것은 의미가 없습니다. –

0

을 그냥 돼지 - 백업 사이드에서,하지만이 작은 조금 더 쉽게

+0

더 읽기 쉽지만 실제로는 동일하지 않습니다. Saeed의 코드는 속성 이름과 일치합니다. 코드는 두 유형이 구조가 동일하다는 가정을합니다. 소스 유형에 'A'라는 추가 속성이 있으면 어떻게 될지 생각해보십시오. –

+0

@YannickMotton 오! 당신은 내 MapNew()에 대해 이야기하고 있습니다. 타이핑을 다시 잊어 버렸습니다. 그의 제 버전에서는 그것을 거기에 보관했지만 MapNew()에 다시 넣어야합니다. 그것을 잡아 주셔서 감사합니다. – Suamere

관련 문제