2017-05-22 3 views
0

2 개의 ObservableCollection이 있는데, class1과 class2 유형입니다.일반 ObservableCollection을 메소드에 전달하고 반복합니다.

private ObservableCollection<Class1> cOne; // collection of objects of type Class1 
private ObservableCollection<Class1> cTwo; // collection of objects of type Class2 

이제 아래의 방법으로이 컬렉션을 반복하고 개체의 멤버에 액세스하려고합니다.

public void MyMethod<T>(){ 
    var listOfLayers = new ObservableCollection<T>(); 

    if (typeof(T) == typeof(Class1)) 
    { 
     listOfLayers = (T) cOne;  
    } 
    else{ 
     listOfLayers = (T) cTwo; 
    } 

    foreach (var entry in listOfLayers){ 
     WL entry.someprop; 
    } 

} 

하지만 형식 변환 시마다 오류가 발생합니다.

Error CS0030 Cannot convert type 'System.Collections.ObjectModel.ObservableCollection' to 'T'

두 가지 방법 모두 기본적으로 별도의 데이터베이스 테이블에서 동일한 작업을 수행하기 때문에 유형에 따라 두 가지 방법을 만들지 않았습니다. 따라서 둘 다 중복 코드를 포함하게됩니다.

답변

0

단순히 T이 아닌 ObservableCollection<T>으로 전송해야합니다. 코드를 수정했습니다 :

public void MyMethod<T>(){ 
    var listOfLayers = new ObservableCollection<T>(); 

    if (typeof(T) == typeof(Class1)) 
    { 
     listOfLayers = (ObservableCollection<T>) cOne;  
    } 
    else{ 
     listOfLayers = (ObservableCollection<T>) cTwo; 
    } 

    foreach (var entry in listOfLayers){ 
     WL entry.someprop; 
    } 
} 

사이드 노드로 코드가 약간 이상해 보입니다. 이는 또한 포인트를 증명하기 위해 예제를 단순화했기 때문에 가능할 수도 있지만 여전히 : cOne은 이미 올바른 유형이므로, 왜 캐스팅합니까?

T 형식을 사용하려면 지원하려는 각 ObservableCollection<T>에 대해 고유 한 메서드를 만드는 것이 좋을 수 있으므로 형식을 전달할 필요가 없습니다. 나는 당신이 다른 T 다른 논리를 실행하고 싶다는 생각을합니다. 그래서 이것을 나누는 것이 의미가 있습니다.

+0

멋진 답변을 해주신 Florian에게 감사드립니다. 그러나 여전히 "System.Collections.ObjectModel.ObservableCollection '를'System.Collections.ObjectModel.ObservableCollection '\t"으로 변경하는 것과 같은 오류가 발생합니다. 나는 두 개의 분리 된 메소드를 생성하는 것이 더 좋다고 생각하지만, 이제는 더 많은 코드 또는 더 적은 코드를 포함 할 것이다. –

+0

else 분기에서이 예외가 발생하지 않았습니까? 그렇다면 'typeof (T)! = typeof (IT.Landbase 조정)'일 수 있습니까? –

+0

기본 유형으로 캐스트 할 수 없다는 점에 유의하십시오 ('T'가 'AdjustIT.Landbase'의 상위 클래스 인 경우 캐스트가 실패합니다). 이유는 다음과 같습니다. https://stackoverflow.com/a/43378505/2259391 –

1

T (T) cOne; 유형의 일부를 유형 ObservableCollection<T> 인 것으로 캐스팅하려고 했으므로 오류가 발생합니다. 즉, COOne을 캐스팅해야합니다. ObservableCollection<T>

0

캐스팅 방법이 올바르지 않습니다. T이 아닌 이 ObservableCollection<T>이므로 listOfLayers = (ObservableCollection<T>) cOne으로 표시되어야합니다.


그것은 나에게 불분명 왜 필요 캐스트하지만. 메서드에 대한 인수로 cOnecTwo을 전달하고 훨씬 깨끗한 코드로 가져올 수 있습니다. Class1Class2이 어떻게 든 관련되어 있으므로 공통 기본 클래스 또는 인터페이스를 공유 할 수 있으므로 ObservableCollection<IBaseClass> 인수를 만들 수 있습니다.

+0

Class1 및 Class2는 infact 모델 클래스입니다. 데이터베이스 테이블을 나타냅니다. 캐스팅을 시도한 메서드는 기본적으로 데이터베이스 쿼리를 거의 수행하지 않고 ObservableCollection 를 초기화합니다. –

관련 문제