2016-12-15 3 views
0

DriverStaistic이라는 모델이 있고이 모델을 상속 한 뷰 모델 뷰 모델에 추가 속성이 포함되어 있지 않습니다. 이는 DriverStaistic의 빈 상속 일뿐입니다. 외부 라이브러리에서 모델 객체를 받고 최소 결합을 유지하려고합니다. 기본 클래스와 하위 클래스가 동일한 속성을 포함하고 있기 때문에 궁금한 점이 있다면 람다 식을 사용하는 것 이외에 다른 속성을 추가하거나 생략 할 때마다 수정해야한다는 것입니다.기본 모델을 하위 모델로 변환

리플렉션을 사용하여이 솔루션으로 출시되었지만 향후 성능 문제가 발생할 것으로 생각됩니다. 누구든지 더 나은 제안을 할 수 있습니까?

public static void FromDriverStatistic(this DriverStatisticsVm viewModel, object model) 
{ 
    bool isDriverStatistic = model is DriverStatistic; 

    if(!isDriverStatistic) 
     throw new InvalidCastException(); 

    var modelProperties = model.GetType().GetProperties(); 
    foreach (var property in modelProperties) 
    { 
     property.SetValue(viewModel, property.GetValue(model)); 
    } 
} 
+0

"외부 라이브러리에서 모델 객체를 받고 최소 결합을 유지하고 싶습니다."이렇게하면 더러운 해킹이 필요합니다. – Will

답변

0

난 반사를 사용하여이 용액으로하여왔다 그러나 나는 미래에 성능 문제를 제시 것으로 판단된다. 누구든지 더 나은 제안을 할 수 있습니까?

옵션은 모든 속성 하나 하나, 즉를 설정하는 것입니다 :

public static void FromDriverStatistic(this DriverStatisticsVm viewModel, DriverStatistic model) 
{ 
    viewModel.PropertyA = model.PropertyA; 
    viewModel.PropertyB = model.PropertyB; 
    //and so on... 
} 

이 방법의 단점은 당신이 컴파일시 모든 속성 이름을 알고 매퍼 방법 때마다 수정해야한다는 것을 분명히 두 클래스 중 하나에서 속성을 추가, 제거 또는 이름을 바꿉니다.

다른 옵션은 리플렉션을 사용하는 것이지만이 단점은 컴파일 타임 안전성과 성능을 잃는 것입니다.

당신은 트레이드 오프 결정을 내려야합니다. 설정할 속성이 몇 개 밖에없는 경우 리플렉션을 사용하여 지불 할 가격이 그만큼 높지는 않습니다. 여러 다른보기 모델/모델 유형 맵핑에 대해 동일한 메소드 또는 논리를 재사용 할 수 있어야합니다. 따라서 유연성을 원한다면 리플렉션을 사용하십시오. 성능 및 컴파일 타임 안전이 중요한 경우에는하지 마십시오.

+0

확실히 람다 식을 반대로 사용하는 것보다 낫지 않습니다. 람다 식의 멋진 성능을 활용할 수있었습니다 – Scarnet

+0

성능과 유연성 중에서 선택해야합니다 :) – mm8

관련 문제