2011-01-14 3 views
8

그래서 난이 (이 예를 들어 간략화 됨)이 같은 두 개의 사용자 정의 복합 유형 :다른 사용자 정의 복합 형식에 사용자 정의 복합 형식을 변환하는 방법

public class PendingProduct 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public int ColorCount { get; set; } 
} 

의 내가 자신을 변환하는 방법을 알고이 객체를 필요로한다고 가정 해 봅시다 다른 유형 : 나는 제품에 PendingProduct을 변환하는 메서드를 호출 할 때

public class Product 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public ProductColors Colors { get; set;} 
} 

그래서, 나는 ProductColor의 "ColorCount"번호는 제품 클래스에 객체를 추가하는 일부 사용자 지정 논리를 실행할 수 있습니다. 이것은 완전히 단순화되었지만 클래스의 아키텍처는 실제로 여기에 관련이 없습니다. 내 주요 질문은 무엇

은 이것이다 :

어떤 개체의 속성이 다른 경우 다른 복합 형 한 복합 형식의 변환을 구현하는 데 사용할 수있는 가장 좋은 연습 방법입니까? 현실 세계에서

는 특성은 매우 다릅니다 그리고 내가 분명히

난 그냥 입력 매개 변수를받는 함수를 작성할 수 B.

객체에 객체 A에서 필요한 매핑 일부 사용자 지정 논리를 작성한다 개체 A의 및 개체 B를 반환하지만 더 많은 "모범 사례"방법을 찾고 있어요. IConvertible이 여기에 등장합니까? 내가 원하는 것을하기위한 함수를 작성하는 것보다는 내가 활용할 수있는 더 OOP와 비슷한 것이 있습니까?

개체 A는 항상 B.

편집 객체 자체를 변환하는 방법을 알고 있어야합니다 :을 측면 참고로, 현실 세계에서, 개체 A와 개체 B는 두 엔티티 프레임 워크 4 단체입니다. "보류중인 제품"을 가져 와서 새로운 제품 엔티티로 변환하고 데이터 컨텍스트에 첨부하여 저장하려고합니다.

답변

18

이 작업은 여러 가지 방법이 있지만 실제로 매핑 코드를 직접 작성하거나 리플렉션을 통해 처리하거나 AutoMapper과 같은 미리 빌드 된 프레임 워크를 사용하는 것으로 바뀝니다. 나는 다른 질문에 비슷한 질문에 대답했습니다 here.

내가 참조를 위해 여기를 추가 할 것입니다 : 현실적으로

그럴 수

1.Reflection

public void Map<TSource, TDestination>(TSource source, TDestination destination) 
{ 
    var props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
    var type = typeof(TDestination); 

    foreach (var prop in props) 
    { 
    object value = prop.GetValue(source, null); 

    var prop2 = type.GetProperty(prop.Name); 
    if (prop2 == null) 
     continue; 

    if (prop.PropertyType != prop2.PropertyType) 
     continue; 

    prop2.SetValue(destination, value, null); 
    } 
} 

2.Copy 생성자

public Employee(Person person) 
{ 
    // Copy properties 
} 

3.Implicit/명시 적 변환

public static implicit operator Employee(Person person) 
{ 
    // Build instance and return 
} 

4.AutoMapper

Mapper.Map<Person, Employee>(person); 

5.Combination 3/4 : 암시 적/명시 적 변환 연산자에 대한

public static implicit operator Employee(Person person) 
{ 
    return Mapper.Map<Person, Employee>(person); 
} 

주의 사항 : 당신이 생성되지 않습니다 이것들을 사용하여 저는 믿습니다 CLS 호환 코드.

AutoMapper는 예컨대 :

Mapper.CreateMap<Person, Employee>() 
     .ForMember(e => e.Forename, o => o.MapFrom(p => p.Forename.ToLower())); 
0

당신이 제품에서 PendingProduct을 유도하고 싶지 않아요, 이상 매핑하는 방법 다른 속성 대상 유형에 사용자 정의 할 수 있습니까?

public class Product 
{  
    public string Name { get; set; }  
    public string Description { get; set; }  
    public ProductColors Colors { get; set; } 
} 

public class PendingProduct : Product 
{   
    public int ColorCount { get; set; } 
} 
관련 문제