我正在开发一个WCF服务,其中的对象定义如下: -
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();
没有用。 所以,我将Test类改为以下: -
public class Test
{
public List<T> x {get;set;}
public List<T> y {get;set;}
}
所以,现在一切正常。我在某处读到我们不应该在公共API中使用List。但是,这也适用于WCF吗?并且,这种方法是正确的还是我应该尝试从Collection<T>
继承ABC和DEF类?
答案 0 :(得分: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));
答案 1 :(得分:0)
我应该尝试从
继承ABC和DEF类Collection<T>
仅当ABC
和DEF
提供的功能高于List<T>
提供的功能时。即便如此,扩展方法可能更合适。
但目前还不清楚为什么你会得到InvalidCastException
- 你需要添加代码,让你知道什么是正确的解决方案。