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)