如何将两个类似的具体对象传递给一个方法,该方法具有在C#中实现泛型的接口参数

本文关键字:方法 接口 参数 泛型 实现 一个 两个 对象 | 更新日期: 2023-09-27 18:28:20

我有以下接口声明:

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>添加到原始接口声明中,但这添加了更多无法解决的错误。这是我第一次深入研究接口,我相信泛型会增加复杂性,所以这里可能根本缺乏理解。

如何将两个类似的具体对象传递给一个方法,该方法具有在C#中实现泛型的接口参数

你试过这个吗:

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);

您可以在接口中定义协变泛型参数,但需要稍微更改接口以确保T不会被反向使用:

public interface IOrder<out T> where T : IOrderItem
{
    IEnumerator<T> Items { get; }
}
public interface IDistro<out T> : IOrder<T> where T : IOrderItem
{
}

T定义为coverient参数(out),允许隐式转换实现变体接口的类。

相关文章: