C# 使用列表实现接口<;T>;财产

C# 使用列表实现接口<;T>;财产,c#,interface,C#,Interface,我有以下问题: public interface IControlSingleContainer { ControlCollection Content { get; set; } } public interface IControlCollectionContainer { // I need to obtain a List of objects that implement IControlSingleContainer interface List<ICo

我有以下问题:

public interface IControlSingleContainer
{
   ControlCollection Content { get; set; }
}

public interface IControlCollectionContainer
{
    // I need to obtain a List of objects that implement IControlSingleContainer interface
    List<IControlSingleContainer> Items { get; set; }
}

public class TabItem : IControlSingleContainer
{
    public ControlCollection Content { get; set; }
}

public class TabbedContainer : IControlCollectionContainer
{
    public List<TabItem> Items { get; set; }  <- ERROR!
}
公共接口IControlSingleContainer
{
ControlCollection内容{get;set;}
}
公共接口IControlCollectionContainer
{
//我需要获得实现IControlSingleContainer接口的对象列表
列表项{get;set;}
}
公共类选项卡项:IControlSingleContainer
{
公共控件集合内容{get;set;}
}
公共类选项卡容器:IControlCollectionContainer
{
公共列表项{get;set;}您很接近了

 public class TabbedContainer : IControlCollectionContainer
    {
        public TabbedContainer()
        {
            Items = new List<IControlSingleContainer>();
            var t = new TabItem();
            Items.Add(t);
        }

        public List<IControlSingleContainer> Items { get; set; }
    }
公共类选项卡容器:IControlCollectionContainer
{
公共选项卡容器()
{
项目=新列表();
var t=新的TabItem();
增加(t)项;
}
公共列表项{get;set;}
}
你很接近了

 public class TabbedContainer : IControlCollectionContainer
    {
        public TabbedContainer()
        {
            Items = new List<IControlSingleContainer>();
            var t = new TabItem();
            Items.Add(t);
        }

        public List<IControlSingleContainer> Items { get; set; }
    }
公共类选项卡容器:IControlCollectionContainer
{
公共选项卡容器()
{
项目=新列表();
var t=新的TabItem();
增加(t)项;
}
公共列表项{get;set;}
}
你很接近了

 public class TabbedContainer : IControlCollectionContainer
    {
        public TabbedContainer()
        {
            Items = new List<IControlSingleContainer>();
            var t = new TabItem();
            Items.Add(t);
        }

        public List<IControlSingleContainer> Items { get; set; }
    }
公共类选项卡容器:IControlCollectionContainer
{
公共选项卡容器()
{
项目=新列表();
var t=新的TabItem();
增加(t)项;
}
公共列表项{get;set;}
}
你很接近了

 public class TabbedContainer : IControlCollectionContainer
    {
        public TabbedContainer()
        {
            Items = new List<IControlSingleContainer>();
            var t = new TabItem();
            Items.Add(t);
        }

        public List<IControlSingleContainer> Items { get; set; }
    }
公共类选项卡容器:IControlCollectionContainer
{
公共选项卡容器()
{
项目=新列表();
var t=新的TabItem();
增加(t)项;
}
公共列表项{get;set;}
}

不完全确定您在这里尝试做什么,但您不能将
列表
强制为
列表
。但是,您可以将界面设置为通用,并添加如下约束:

public interface IControlCollectionContainer<T> where T : IControlSingleContainer
{
    List<T> Items { get; set; }
}
公共接口IControlCollectionContainer,其中T:IControlSingleContainer
{
列表项{get;set;}
}
现在,您的类定义变为:

public class TabbedContainer : IControlCollectionContainer<TabItem>
{
    public List<TabItem> Items { get; set; } 
}
公共类选项卡容器:IControlCollectionContainer
{
公共列表项{get;set;}
}

不完全确定您在这里尝试做什么,但您不能将
列表
强制为
列表
。但是,您可以将界面设置为通用,并添加如下约束:

public interface IControlCollectionContainer<T> where T : IControlSingleContainer
{
    List<T> Items { get; set; }
}
公共接口IControlCollectionContainer,其中T:IControlSingleContainer
{
列表项{get;set;}
}
现在,您的类定义变为:

public class TabbedContainer : IControlCollectionContainer<TabItem>
{
    public List<TabItem> Items { get; set; } 
}
公共类选项卡容器:IControlCollectionContainer
{
公共列表项{get;set;}
}

不完全确定您在这里尝试做什么,但您不能将
列表
强制为
列表
。但是,您可以将界面设置为通用,并添加如下约束:

public interface IControlCollectionContainer<T> where T : IControlSingleContainer
{
    List<T> Items { get; set; }
}
公共接口IControlCollectionContainer,其中T:IControlSingleContainer
{
列表项{get;set;}
}
现在,您的类定义变为:

public class TabbedContainer : IControlCollectionContainer<TabItem>
{
    public List<TabItem> Items { get; set; } 
}
公共类选项卡容器:IControlCollectionContainer
{
公共列表项{get;set;}
}

不完全确定您在这里尝试做什么,但您不能将
列表
强制为
列表
。但是,您可以将界面设置为通用,并添加如下约束:

public interface IControlCollectionContainer<T> where T : IControlSingleContainer
{
    List<T> Items { get; set; }
}
公共接口IControlCollectionContainer,其中T:IControlSingleContainer
{
列表项{get;set;}
}
现在,您的类定义变为:

public class TabbedContainer : IControlCollectionContainer<TabItem>
{
    public List<TabItem> Items { get; set; } 
}
公共类选项卡容器:IControlCollectionContainer
{
公共列表项{get;set;}
}

这是根据您的用例而存在的原因之一

在您的情况下,当直接使用
TabbedContainer
时,您希望您的
Items
TabItem
。但是,该接口要求
Items
是一个特定的接口

诀窍是同时声明
TabbedContainer.Items
IControlCollectionContainer
,但在幕后重用
TabItem

public class TabbedContainer : IControlCollectionContainer
{
    public List<TabItem> Items { get; set; } 

    List<IControlSingleContainer> IControlCollectionContainer.Items 
    { 
        get 
        { 
            return // Your actual tab items 
        }

        set 
        { 
             Items = //Whatever you need to do make sure you have actual
                     // TabItem objects
        }
    }
}
公共类选项卡容器:IControlCollectionContainer
{
公共列表项{get;set;}
列出IControlCollectionContainer.Items
{ 
得到
{ 
return//返回实际的选项卡项
}
设置
{ 
Items=//无论您需要做什么,请确保您有实际的
//选项卡项对象
}
}
}
您需要更新上面的示例以实际处理设置/获取接口版本的项,但主要思想是重用
TabItem
集合,以便它们始终同步

实际上,当您使用
TabbedContainer
并调用
Items
时,您将得到
TabItem
的列表,但当您将实例作为
IControlCollectionContainer
使用时,您的
Items
将返回
IControlCollectionContainer.Items

但请注意,这可能会变得相当复杂,具体取决于您传递/修改容器实例的方式。如果您通过
TabbedContainer
IControlCollectionContainer
声明不断修改项,则尝试同步这些项可能会很困难ns有时可以帮助您后退一步,重新评估您的最终目标是什么以及您在属性上声明的类型


例如,如果您实际上没有将项添加到界面的列表中,那么为什么还要使用
list
?作为
IEnumerable
IReadOnlyCollection

这是根据您的用例而存在的原因之一

在您的情况下,在使用
选项卡时,您希望您的
项目
选项卡项目