2014-01-10 27 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嗎?而且,這種方法是正確的還是應該嘗試從Collection<T>繼承ABC和DEF類?

回答

2

這將導致一個InvalidCastException

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

這不會

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

你在做什麼是第一位的等價物。可能有更好的方法,但一種解決方案是將構造函數添加到採用IEnumerable的ABC。

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

然後改變你的return語句看起來像這樣。

return new ABC(result.OrderBy(i=>i.s).ThenBy(j=>j.a)); 
+0

謝謝。我會研究這一點 – Max

0

我應該嘗試從Collection<T>

只有ABCDEF上面什麼List<T>提供報價的功能繼承ABC和DEF類。即使如此,擴展方法可能更合適。

但目前尚不清楚爲什麼你會得到一個InvalidCastException - 你需要添加代碼,讓你知道什麼是合適的解決方案。

+0

我已更新帖子 – Max