wcf继承自list <t> </t>

时间:2014-01-10 14:25:15

标签: c# wcf generic-list

我正在开发一个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类?

2 个答案:

答案 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)

  

我应该尝试从Collection<T>

继承ABC和DEF类

仅当ABCDEF提供的功能高于List<T>提供的功能时。即便如此,扩展方法可能更合适。

但目前还不清楚为什么你会得到InvalidCastException - 你需要添加代码,让你知道什么是正确的解决方案。

相关问题