2017-09-15 21 views
1

나는 추상 클래스에서 파생 된 여러 클래스가 있습니다. 메서드에서 파생 클래스 중 하나 인 개체를받습니다. 개체의 유형을 확인하고 올바른 속성에 할당해야합니다. 직접적인 해결책은 작동하지만 리팩토링 될 수있는 것처럼 보입니다. 그래도 난 그것을 접근하는 방법을 모른다 :C# 리 팩터링 : 파생 클래스의 유형을 확인하고 동일한 클래스의 변수에 할당

public MyDerived1 derived1; 
    public MyDerived2 derived2; 
    // .... 
    public MyDerivedX derivedX; 

    public void AssignValue(MyBaseClass entity) 
    { 
     var derivedOne = entity as MyDerived1; 
     if (derivedOne != null) 
     { 
      derived1 = derivedOne; 
      return; 
     } 

     var derivedTwo = entity as MyDerived2; 
     if (derivedTwo != null) 
     { 
      derived2 = derivedTwo; 
      return; 
     } 

     // .... 

     var derivedEx = entity as MyDerivedX; 
     if (derivedEx != null) 
     { 
      derivedX = derivedEx; 
      return; 
     } 
    } 
+1

왜 'is'키워드를 사용하지 않습니까? 자세한 내용은 다음을 참조하십시오. https://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.110).aspx –

+0

'derived1 = entity as MyDerived1;과 같은 구문을 사용할 수 있습니다. – DavidG

답변

2

당신은 다음과 같이 AssignValue의 일반 버전을 만들 수 있습니다

MyDerived1 derived1; 
MyDerived2 derived2; 

var _ = AssignValue(entity, out derived1) 
    || AssignValue(entity, out derived2); 
:

지금
private static bool AssignValue<T>(MyBaseClas entity, out T derived) where T : MyBaseClas 
{ 
    var t = entity as T; 
    if (t == null) 
    { 
     derived = null; 
     return false; 
    } 

    derived = t; 
    return true; 
} 

이 방법으로 사용할 수 있습니다

일반 함수는 bool을 반환하여 첫 번째 일치시 보류중인 유형 검사를 건너 뜁니다.

+0

이 작업은 효과가 있지만 불쾌한 해킹 인 것 같습니다. – DavidG

0

어쩌면 당신은 그런 것을 찾고 있습니다 :

public void AssignValue(MyBaseClass entity) 
    { 
     var item = this.GetType().GetFields().FirstOrDefault(x => x.FieldType == entity.GetType()); 
     if (item != null) 
     { 
      item.SetValue(this, entity); 
     } 
    }