我用C#编写的WPF程序在后端有以下接口:
public interface CatalogMenu<T> : CatalogItem where T : CatalogItem
{
void AddCatalogItem(T toAdd);
void RemoveCatalogItem(T toRemove);
List<T> AvailableCatalogItems { get; }
}
我有三个实现接口的类,每个类都有不同的T。问题是我想创建一个List<CatalogMenu<CatalogItem>>
来绑定到ListView,但View Model中的这个属性没有编译。。。(thing1、thing2和thing3都用不同的T实现接口)
public List<CatalogMenu<CatalogItem>> MenuCategories
{
get
{
return new List<CatalogMenu<CatalogItem>>(){
ModuleCatalog.thing1,
ModuleCatalog.thing2,
ModuleCatalog.thing3
};
}
}
尽管我很希望它,但编译器不允许我将"实现CatalogMenu<T>
的类,其中t是CatalogEntity"视为"CatalogMenu<CatalogItem>
"。我想通过一个公共接口将实现接口的每个类呈现给用户。
如果我遗漏了任何细节,请耐心等待;在过去的30分钟里,我读到了关于协方差的文章,试图找出解决这个问题的方法。
.Net不支持协变类。
如果添加ICatalogMenu<out T>
,则可以将任何CatalogMenu强制转换为ICatalogMenu<CatalogItem>
并将其放入List<ICatalogMenu<CatalogItem>>
您可以使用普通的非泛型接口或基类来实现同样的效果。