实例化通用接口

时间:2017-04-18 15:39:13

标签: c# generics

我有两个界面:

public interface IReportRow
{
    List<string> ToList();
}

public interface IReportPreparer<T>
    where T : IReportRow
{
    List<T> GetRows(JObject json);
    string GetAdditionalData(T reportRow);
}

实现IReportRow接口的类:

public class SellingReportRow : IReportRow
{
  ...interface implementation
}

以及实现IReportPreparer接口的类:

public class SellingReportPreparer : 
IReportPreparer<SellingReportRow>
{
  ...interface implementation
}

现在,当我尝试像这样创建一个SellingReportPreparer类的实例时:

IReportPreparer<IReportRow> preparer = new SellingReportPreparer()

Intellisense告诉我,我需要从SellingReportPreparer to IReportPreparer< IReportRow >进行显式转换。

当我明确转换时:

IReportPreparer<IReportRow> preparer = (IReportPreparer<IReportRow>)(new SellingReportPreparer());

我收到例外情况 - Unable to cast object of type VSKCasco.ReportPrepare.SellingReportPreparer to type VSKCasco.ReportPrepare.IReportPreparer1[VSKCasco.ReportPrepare.IReportRow]

我需要IReportPreparer接口是通用的,因此它的两个方法都可以使用相同的IReportRow实现类型。我该如何制作SellingReportPreparer的实例?

2 个答案:

答案 0 :(得分:0)

您需要IReportPreparer将其通用参数指定为out

public interface IReportPreparer<out T>
    where T : IReportRow
{
    //List<T> GetRows(JObject json);
    //string GetAdditionalData(T reportRow);
}

然后这行将编译

IReportPreparer<IReportRow> preparer = new SellingReportPreparer();

然而,(H / T @GiladGreen),您注意到我已经注释掉了列表中使用T的行 - 因为列表不能协变。如果你可以逃脱IEnumerable<T>那么它就可以了。

public interface IReportPreparer<out T>
    where T : IReportRow
{
    IEnumerable<T> GetRows(JObject json);
    //string GetAdditionalData(T reportRow);
}

请注意,此时GetAdditionalData仍被注释掉 - 同样的问题,没有解决方案!

答案 1 :(得分:0)

中的类型
public class SellingReportPreparer : 
IReportPreparer<**SellingReportRow**>
{
  ...interface implementation
}

需要像这样的IReportRow

public class SellingReportPreparer : 
IReportPreparer<IReportRow>
{
  ...interface implementation
}

为什么第一个不编译:

您告诉SellingReportPreparer实现支持SellingReportRow类型的IReportPreparer。但是,IReportPreparer不支持SellingReportRow,它只知道IReportRow,它不需要知道更多。