Raj*_*Raj 5 c# generics collections
我有两个对象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
{
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的测试课 -
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.
}
}
Run Code Online (Sandbox Code Playgroud)
在测试类中,当我建立父子关系时,我可以将项添加为元项对象的子对象.在这里,我希望生成编译错误.
有人可以帮助我实现这个目标吗?
-Regards Raj
你为什么不认为该行应该编译?它看起来完全有效。
ChildItems 列表是公开的。如果您不希望它们能够添加到列表中,那么您将需要包装您自己的集合或使用ReadOnlyCollection<IHierachy<IEntity>>.
哦,你的问题已经解决了。我认为解决方案是使实体类通用。
using System.Collections.Generic;
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<T> : IHierachy<T>, IEntity
{
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public IHierachy<T> _parent;
public IHierachy<T> Parent
{
get
{
return _parent;
}
}
private List<IHierachy<T>> _childItems;
public List<IHierachy<T>> ChildItems
{
get
{
if( _childItems == null )
{
_childItems = new List<IHierachy<T>>();
}
return _childItems;
}
}
private List<IHierachy<T>> _linkedItems;
public List<IHierachy<T>> LinkedItems
{
get
{
if( _linkedItems == null )
{
_linkedItems = new List<IHierachy<T>>();
}
return _linkedItems;
}
}
}
public class Item : Entity<Item>
{
}
public class MetaItem : Entity<MetaItem>
{
}
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.
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |