我有两个对象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
    {
    }

}

以下是我的考试类(class)-
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.
    }
}

在测试类中,当我建立父子关系时,可以将item添加为meta-item对象的子对象。在这里,我希望生成编译错误。

有人可以帮助我实现这一目标。

-问候
拉吉

最佳答案

该代码正在编译,因为ChildItems将是IList<Entity>,其中包括ItemMetaItem。如果要使Entity通用:

public class Entity<T> : IHierachy<T>, IEntity where T : IEntity { ... }

然后,您将像这样定义ItemMetaItem:
public class Item : Entity<Item> { }

public class MetaItem : Entity<MetaItem> { }

在这种情况下,其ChildItems将是正确的,更受限制的类型。

09-25 20:44