Linq输出作为接口?

时间:2008-09-25 15:57:01

标签: linq casting interface

以下是我正在尝试执行的代码:

public IList<IOperator> GetAll()
{
      using (var c = new MyDataContext())
      {
          return c.Operators.ToList();
      }
}

运算符实现IOperator,但我收到以下编译错误:

Cannot implicitly convert type 'System.Collections.Generic.List<MyProject.Core.Operator>' to 'System.Collections.Generic.IList<MyProject.Core.Model.IOperator>'. An explicit conversion exists (are you missing a cast?)

如何将其转换为我需要的东西?

4 个答案:

答案 0 :(得分:6)

尝试Cast<>()方法:

return c.Operators.Cast<IOperator>().ToList();

答案 1 :(得分:4)

如果我将代码更改为以下内容:

public IList<IOperator> GetAll()
{
      using (var c = new MyDataContext())
      {
           var operators = (from o in c.Operators
                            select o).Cast<IOperator>();

           return operators.ToList();
      }
}

它不仅可以编译,而且实际上有效!感谢你们朝着正确的方向努力。

答案 2 :(得分:0)

编辑:实际上,

return(List&lt; IOperator&gt;)c.Operators.ToList();

做这个伎俩。遗憾

答案 3 :(得分:0)

使用ConvertAll&lt;&gt;

http://msdn.microsoft.com/en-us/library/kt456a2y.aspx

例如:在这种情况下,TEntity必须是IBusinessUnit,但是是一个类,所以我在转换List<Operator> to List<IOperator>时遇到同样的麻烦(假设操作员实现了IOperator)。

在你的情况下,就像你说的那样,运营商不会阻止IOperator,但这无关紧要 - 这仍然有效 -

 public static IList<IBusinessUnit> toIBusinessUnitIList(List<TEntity> items)
      {

      return items.ConvertAll<IBusinessUnit>(new Converter<TEntity, IBusinessUnit>(TEntityToIBuisinessUnit));
      }

  /// <summary>
  /// Callback for List<>.ConvertAll() used above.
  /// </summary>
  /// <param name="md"></param>
  /// <returns></returns>
  private static IBusinessUnit TEntityToIBuisinessUnit(TEntity te)
  {
   return te;  // In your case, do whatever magic you need to do to convert an Operator to an IOperator here.
  }