2014-01-10 3 views
1

이있는 개체를 다음과 같이 정의 된 목록에서 상속 -WCF 내가 WCF 서비스를하고 있어요 <T>

public class Test1 
{ 
public string s {get;set;} 
public string a {get;set;} 
} 

public class Test2 
{ 
    public string u {get;set;} 
    public string v {get;set;} 
} 

public class ABC : List<Test1> 

public class DEF: List<Test2> 

public class Test 
{ 
    public ABC x {get;set;} 
    public DEF y {get;set;} 
} 

예외가 (그 결과는 클래스 ABC의 인스턴스 가정)했다 제기 코드 : -

return result.OrderBy(i=>i.s).ThenBy(j=>j.a); 

위의 코드는 런타임에 InvalidCastException을 던졌습니다. OrderBy가 IOrderedEnumerable을 반환했기 때문에이를 캐스팅 할 수 없었기 때문에 이런 일이 발생했다고 가정합니다. 위 코드의 다양한 변형을 시도했습니다. -

return (ABC)result.OrderBy(i=>i.s).ThenBy(j=>j.a); 
return (ABC)result.OrderBy(i=>i.s).ThenBy(j=>j.a).ToList(); 

아무 것도 작동하지 않았습니다. 그래서, 나는 다음에 테스트 클래스를 변경 : -

public class Test 
{ 
    public List<T> x {get;set;} 
    public List<T> y {get;set;} 
} 

그래서, 모든 것이 작동 벌금을 지금. 우리는 공개 API에서 List를 사용하면 안되는 곳을 읽었습니다. 그러나 WCF에도 적용됩니까? 그리고이 접근법이 정확합니까? 아니면 ABC 및 DEF 클래스를 상속하려고 시도해야합니까? Collection<T>?

답변

2

이 InvalidCastException이

List<Test1> test1 = new List<Test1>(); 
ABC abc = (ABC)test1; 

의 원인이됩니다 이것은 당신이하고있는 것은 첫 번째에 해당하지

List<Test1> test1 = new ABC(); 
ABC abc = (ABC)test1; 

입니다 것입니다. 더 나은 방법이있을 수 있지만 하나의 솔루션은 ABC에 생성자를 추가하여 IEnumerable을 사용하는 것입니다.

public class ABC : List<Test1> 
{ 
    public ABC(IEnumerable<Test1> enumerable) 
    { 
     if (enumerable != null) 
     this.AddRange(enumerable); 
    } 
} 

다음과 같이 반환 명세서를 변경하십시오.

+0

감사합니다. 나는 이것을 들여다 볼 것이다. – Max

0

나는 Collection<T>

경우에만 ABCList<T>가 제공하는 무엇을 위 DEF 제공 기능에서 ABC와 DEF 클래스를 상속 시도해야합니다. 그럼에도 불구하고 확장 방법이 더 적절할 수 있습니다.

그러나 이유는 무엇입니까? InvalidCastException - 적절한 해결책이 무엇인지 알기 위해 해당 예외를 제공하는 코드를 추가해야합니다.

+0

게시물을 업데이트했습니다. – Max