如何在此场景中返回List <myinterface> </myinterface>

时间:2009-07-31 00:37:26

标签: c# .net interface

首先让我说使用接口我是个新手。

我正在写一个方法(GetClaimDetails),它将返回有关医疗保险索赔的信息。如果它是声明类型A,它将返回ClaimDetailA类的列表。如果声明类型B,则返回ClaimDetailB类的列表。这两个类共享公共属性,但每个类都具有唯一属性。公共属性在接口中实现。

我提取了一个名为IClaimDetail的接口并设置它们来实现它。当我设置方法返回IClaimDetail并让它返回实现IClaimsDetail的对象的实例时,我得到编译器消息

'无法将类型'System.Collections.Generic.List DentalClaimDetail'隐式转换为'System.Collections.Generic.List IClaimDetail'

  private static List<IClaimDetail> GetClaimDetailsB(string claimNumber, string connectionStringName)
        {

          var claimReportRows = new List<DentalClaimDetail>();
         ..removed for brevity
      return claimReportRows;
    } 



   public class DentalClaimDetail : IClaimDetail
    {
    ...
    }

当一个方法返回一个接口时,你只需返回一个实现该接口的对象。正确?我做错了什么?

2 个答案:

答案 0 :(得分:7)

var claimReportRows = new List<IClaimDetail>();

改变这一点。然后,您仍然可以将DentalClaimDetail插入其中。

答案 1 :(得分:1)

泛型实际上在编译时为每个泛型参数动态生成一个类型,因此List&lt; IClaimDetail&gt;是一种类型,List&lt; DentalClaimDetail&gt;实际上是另一种类型,所以你会得到编译器错误。

是的,跛脚,但只是改变你的电话,如Daniel A. White所述

var claimReportRows = new List<IClaimDetail>();

(虽然您应该只能直接使用该类型,除非您使用Linq)然后让代码使用强制转换将DentalClaimDetail强制转换为IClaimDetail应该可以解决问题。 如果不使用Linq,您可以执行以下操作:

List<IClaimDetail> claimReportRows = new List<IClaimDetail>();
//...populate Dentail Claims Here...
foreach(DentalClaimDetail dcd in dentalClaims)
{
  claimReportRows.Add((IClaimDetail)dcd);
}
return claimReportRows.

希望这有帮助!