c# - 如何将两个相似的具体对象传递给具有在 C# 中实现泛型的接口(interface)参数的方法?

标签 c# generics interface

我有以下接口(interface)声明:

interface IOrder<T> where T: IOrderItem
{
     IList<T> Items { get; set; }
}

interface IDistro<T> : IOrder<T> where T: IOrderItem
{

}

我有两个具体类,如下所示:

// DistroItem implements IOrderItem
public class Distro : IDistro<DistroItem>
{
    public IList<DistroItem> Items { get; set; }
}

// PerishableOrderItem implements IOrderItem
public class PerishableOrder : IDistro<PerishableOrderItem>
{       
    public IList<PerishableOrderItem> Items { get; set; }
}

最后,我有一个保存到数据库的静态服务方法:

public static void UpdateDistro(IDistro<IOrderItem> distro)
{

}

我的问题是,如何将任一具体类型的发行版传递给我的静态方法?以下不编译:

Distro d = new Distro();
UpdateDistro(d);

错误是:

The best overloaded method match for UpdateDistro(IDistro<IOrderItem>)' has some invalid arguments

逆变是答案吗?我尝试添加 <in T>到原始接口(interface)声明,但这增加了我无法解决的更多错误。这是我第一次深入研究接口(interface),我确信泛型增加了复杂性,因此这里可能缺乏基本的理解。

最佳答案

你试过这个吗:

public static void UpdateDistro<T>(IDistro<T> distro) 
  where T : IOrderItem
{  
} 

编辑:

DistroItemPerishableItem 类(均实现 IOrderItem)的空实现,我得到了以下编译且没有错误:

Distro d = new Distro();
PerishableOrder p = new PerishableOrder();

UpdateDistro(d);
UpdateDistro(p);

关于c# - 如何将两个相似的具体对象传递给具有在 C# 中实现泛型的接口(interface)参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9773526/

相关文章:

c# - 如何计算两次之间的差异?

c# - 如何在 web.config 中设置 session 超时

c# - WPF 中的 Prism 弹出新窗口

java - 如何构造通用可变参数的 EnumSet?

c# - 动态查询 SQL Server

c# - LINQ 中的返回模态平均值(模式)

java - 如何将类型安全对象强制转换为 JComboBox<String>?

inheritance - Swift——要求实现协议(protocol)的类是某个类的子类

java - 为什么集合框架中没有堆栈接口(interface)?

c++ - 我可以在基类中重载纯虚方法吗?