C# 泛型和集合
我有两个对象 MetaItems 和 Items。
MetaItem 是对象的模板,而 Items 包含实际值。例如,“部门”被视为元项目,“销售”、“英国区域”、“亚洲区域”被视为项目。
此外,我想维持这些元项目和项目的父子关系。
我有以下相同的代码 -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WpfApplication12
{
public interface IEntity
{
int Id { get; set; }
string Name { get; set; }
}
public interface IHierachy<T>
{
IHierachy<T> Parent { get; }
List<IHierachy<T>> ChildItems { get; }
List<IHierachy<T>> LinkedItems { get; }
}
public class Entity : IHierachy<IEntity>, IEntity
{
#region IObject Members
private int _id;
public int Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
#endregion
#region IHierachy<IEntity> Members
public IHierachy<IEntity> _parent;
public IHierachy<IEntity> Parent
{
get
{
return _parent;
}
}
private List<IHierachy<IEntity>> _childItems;
public List<IHierachy<IEntity>> ChildItems
{
get
{
if (_childItems == null)
{
_childItems = new List<IHierachy<IEntity>>();
}
return _childItems;
}
}
private List<IHierachy<IEntity>> _linkedItems;
public List<IHierachy<IEntity>> LinkedItems
{
get
{
if (_linkedItems == null)
{
_linkedItems = new List<IHierachy<IEntity>>();
}
return _linkedItems;
}
}
#endregion
}
public class Item : Entity
{
}
public class MetaItem : Entity
{
}
}
以下是我的测试类 -
public class Test
{
public void Test1()
{
MetaItem meta1 = new MetaItem() { Id = 1, Name = "MetaItem1"};
MetaItem meta2 = new MetaItem() { Id = 1, Name = "MetaItem 1.1"};
Item meta3 = new Item() { Id = 101, Name = "Item 1" };
**meta1.ChildItems.Add(meta3);** // this line should not compile.
meta1.ChildItems.Add(meta2) // This is valid and gets compiled.
}
}
在测试类中,当我构建父子关系时,我可以添加项目作为元项目对象的子对象。这里我想要生成编译错误。
有人可以帮助我实现这一目标吗?
-问候 拉吉
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
代码正在编译,因为
ChildItems
将是IList
,其中包括Item
和MetaItem
。如果您要使Entity
通用:那么您将像这样定义
Item
和MetaItem
:在这种情况下,它们的
ChildItems
将是正确的、更受限制的类型。The code is compiling because
ChildItems
will beIList<Entity>
, which includes bothItem
andMetaItem
. If you were to makeEntity
generic:Then you would define
Item
andMetaItem
like this:In which case their
ChildItems
would be of the correct, more restricted, type.你为什么不认为该行应该编译?它看起来完全有效。
ChildItems 列表是公开的。如果您不希望它们能够添加到列表中,那么您需要包装自己的集合或使用
ReadOnlyCollection>
。哦,你的问题已经解决了。我认为解决方案是使实体类通用。
Why don't you think that line should compile? It looks completely valid.
The ChildItems list is public. If you don't want them to be able to add to the list then you will need to wrap your own collection or use the
ReadOnlyCollection<IHierachy<IEntity>>
.Oh, you have fixed your question. I think the solution is to make the Entity class generic.