2013-04-21 2 views
1

요소를 나타내는 class X이 있습니다. 클래스 A, B, CD은이 하위 클래스이며 요소에 추가 동작을 추가합니다.메서드는 서브 클래스 대신 슈퍼 클래스 목록을 반환합니다.

TypeA, TypeB, TypeCTypeD의 값을 가지고 있습니다.

내 현재 시나리오에는 X 유형의 컬렉션을 보유하고 method GetElementsByType(ElementType type)이있는 class Y이 있습니다.

이 메서드를 호출 할 때 형식에 따라 요소가있는 목록의 모든 항목 목록을 반환하고 싶습니다.

첫 번째 시도에서이 결과가 끝났지 만 수퍼 클래스와 하위 클래스 간의 변환 오류가 발생했습니다.

두 번째 시도에서 각 하위 클래스가 변환 오류를 피해야하는 공통 인터페이스를 구현하도록하여이 변환을 피하려고했습니다.

은 이걸로 끝났다 :

public interface IElement { 
} 

A : X, IElement 
B : X, IElement 
C : X, IElement 
D : X, IElement 


public List<IElement> GetElementsByType(ElementType type) { 
      switch (type) { 
       case ElementType.TypeA: 
        return new List<IElement>(Elementen.OfType<A>().ToList()); 
       case ElementType.TypeB: 
        return new List<IElement>(Elementen.OfType<B>().ToList()); 
       case ElementType.TypeC: 
        return new List<IElement>(Elementen.OfType<C>().ToList()); 
       case ElementType.TypeD: 
        return new List<IElement>(Elementen.OfType<D>().ToList()); 
       default: 
        throw new ArgumentException(); 
      } 
     } 
그러나

, 내가 눈치 곳에서이 방법, 예를 들어,

var result = obj.GetElementsByType(ElementType.TypeA).FirstOfDefault(a => a.PropX == variable)

를 호출 할 때 람다 표현식이 중 하나를 검색 할 수 없습니다 속성은 이지만 IElement 내부에 정의 된 모든 항목이 남습니다.

단일 메서드를 호출하고 매개 변수로 열거 형을 추가 한 다음 수퍼 클래스로 정의 된 Collection의 하위 클래스 중 List을 반환 할 수 있도록이 문제를 해결할 수 있습니까?

+0
+0

함수 매개 변수에 대한 선택은 전적으로 형식 매개 변수에 대해 몰랐기 때문에 전적으로 이루어졌습니다. Kenneth와 당신의 지시를 따르고 유형 매개 변수를 사용하여 내 문제를 해결하고 있습니다. –

답변

4

당신은 조금 더 간단이 할 수있는 :

public List<T> GetElementsByType<T>() where T : X 
{ 
     return Elementen.OfType<T>().ToList(); 
} 
+0

나는 C# 구문의이 부분 ('T : X')을 아직 다루지 않았습니다. 저를 향해 주셔서 고마워요. 매개 변수를 사용하여이 메서드를 호출하면 어떻게 될까요? 쿼리해야하는 형식이 정의 된 곳을 볼 수 없습니다. –

+0

죄송 합니다만 약간의 오타가 일반 인수를 추가하는 것을 잊었습니다. 나는 대답을 편집했다 – Kenneth

+0

@ 케네스 이제 더 나아졌다. OP가이 솔루션 (즉, 그의 'ElementType' 매개 변수 대신 제네릭 타입 매개 변수)으로 괜찮다고 가정하면 트릭을 수행 할 것이다. – dasblinkenlight

관련 문제