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
这是根据您的用例而存在的原因之一
在您的情况下,在使用选项卡时,您希望您的项目
是选项卡项目