2012-12-04 3 views
3

하나의 일반 메소드가 있습니다. 여기에서 T를 인터페이스 유형으로 전달할 수 있습니다. 메서드는 T 유형에 해당하는 데이터 목록을 반환합니다. 나는이 방법에 대해 20-25 개의 동일한 조건을 가지고 어떻게 논리를 최적화 할 수 있습니까?일반 메소드 로직 최적화

클래스는 인터페이스를 구현합니다. 예제 학생 클래스는 IStudent 인터페이스를 구현합니다. 여기

public ObservableCollection<T> GetAll<T>() 
    { 
     try 
     { 
      if (typeof(T) == typeof(IStudent)) 
      {     
       return GetAll<T, Student>(); 
      } 
      else if (typeof(T) == typeof(IZone)) 
      { 
       return GetAll<T, Zone>(); 
      } 
      else if (typeof(T) == typeof(IEmployee)) 
      { 
       return GetAll<T, Employee>(); 
      } 
      else if (typeof(T) == typeof(ICourse)) 
      { 
       return GetAll<T, Course>(); 
      } 
     } 
    } 

호출자 통과 인터페이스 타입 T 및 I 내가 변경할 수없는 기본 클래스 T. 다른 함수의리스트를 반환 다른 함수 T 및 클래스 패스 T.의 종류를 확인한다. 누구나 나에게 비슷한 것을 제안 해 줄 수 있습니까?

+5

이 논리가 처음부터 generics의 요점을 완전히 무시하지는 않습니까? – Jamiec

답변

2

당신은 시도 및 반사를 통해이 작업을 수행 할 수 있습니다를

public ObservableCollection<T> GetAll<T>() 
{ 
    var typeName = typeof(T).FullName; 
    var indexOfDot = typeName.LastIndexOf('.'); 
    var newTypeName = typeName.SubString(0, indexOfDot) + '.' + typeName.SubString(indexOfDot + 1); 
    var newType = Type.GetType(newTypeName); 
    var methodTypes = new [] { typeof(T), newType }; 
    var method = GetType().GetMethod("GetAll"); 
    var typedMethod = method.MakeGenericMethod(methodTypes); 
    return (ObservableCollection<T>) typedMethod.Invoke(this, new object[0]); 
} 

예쁘지는 않지만 작업을 수행해야하며 일반적으로 수행해야합니다. GetAll 메서드가 일반적인 매개 변수로 오버로드되어 현재의주의 사항이 있으므로 두 가지가 있기 때문에 올바른 방법을 얻지 못하거나 실패합니다. 오른쪽에 표시 할 수 있는지 확인해 보겠습니다.

+1

감사합니다 !!! 그것은 나를 위해 작동합니다. –

5

나는 당신이 t 전혀, 당신은 모든 종류의에 의해 구현 된 공통 인터페이스를 만들 수있는 일반 필요 "돈 생각한다.

public interface IObservableElement 
{ 
    public ObservableCollection<IObservableElement> GetAll(); 
} 
+0

여기서 호출자 인터페이스 타입과 T의 타입을 확인합니다. 다른 함수 T와 T의리스트를 반환하는 클래스로 넘어갑니다. 변경할 수없는 기본 클래스의 다른 함수. –

+1

일반을 기반으로 디자인을 변경할 수없는 경우 René Wolferink에서 제안한 리플렉션이 가장 좋은 문제입니다. – AlexH