2010-06-23 4 views
5

두 개체 MetaItems 및 Items 있습니다.C# 제네릭과 컬렉션

MetaItem은 개체의 템플릿이며 Item에는 실제 값이 들어 있습니다. 예를 들어 "Department"는 메타 항목으로 취급되고 "Sales", "UK Region", "Asia Region"은 항목으로 취급됩니다.

또한 이러한 메타 항목 및 항목에 대해 부모 - 자식 관계를 유지하려고합니다. 같은 대한

나는 다음 한 코드 - 테스트 클래스에서

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. 
    } 
} 

, 내가 부모 - 자식 관계를 buidling하고 때, 나는 같은 항목을 추가 할 수 있습니다 -

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 
    { 
    } 

} 

다음은 내 테스트 클래스 메타 아이템 오브젝트의 아이 오브젝트 여기에 컴파일 오류가 발생합니다.

누군가 내게 도움이 될 수 있습니까?

-Regards는 라지

+0

메타 아이템이 다른 아이템을 포함하는 아이템 일 경우, 실제로는 아이템 인데, 여기서'T = 아이템 '은 아닌가? –

+2

질문과 관련이 없지만 Entity.Id 및 Name의 경우 자동 구현 속성은 친구입니다. – dahlbyk

답변

0

왜 그 라인 컴파일해야한다고 생각하지 않는다? 그것은 완전히 유효 해 보입니다.

ChildItems 목록은 공개입니다. 목록에 추가 할 수 없도록하려면 컬렉션을 직접 포장하거나 ReadOnlyCollection<IHierachy<IEntity>>을 사용해야합니다.

오, 질문을 수정했습니다. 나는 해결책이 Entity 클래스를 generic으로 만드는 것이라고 생각한다. ChildItemsItemMetaItem 모두 포함 IList<Entity>을 할 수 있기 때문에

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. 
     } 
    } 

} 
+0

나는 그가 MetaItem의 자식으로 Item을 추가하는 것을 원하지 않는다고 생각한다. (비록 코드가 현명하더라도 둘 다 Entity 타입이다.) 즉, MetaItem.ChildItems 만 다른 MetaItem을 포함해야합니다. Entity에 익숙하지 않아서 ChildItem을 MetaItem의 목록으로 변경하는 것이 좋습니다. – Alan

+0

아, 그래, 그는 질문을 수정했고 당신은 완전히 맞습니다. 당신은 Entities/Hierachies를보다 일반적인 것으로 만들 필요가 있습니다. 지금 내 솔루션을 수정하고 있습니다. –

3

코드는 컴파일됩니다. 당신이 일반적인 Entity 할 것 인 경우 :

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

을 그럼 당신은 이런 ItemMetaItem을 정의하는 것입니다 :

public class Item : Entity<Item> { } 

public class MetaItem : Entity<MetaItem> { } 

하는 경우 자신의 ChildItems 정확한,보다 제한된 입력이 될 것입니다.

+0

'Entity '내부의 'IEntity'에 대한 참조를'T'로 변경 한 후 작동하도록했습니다. 자신을 전문으로 상속하는 것은 흥미로운 기술입니다. –

+0

예, 엔터티 변경 완료는 연습으로 남았습니다. :) 특정 시나리오에 대한 유용한 기술입니다. – dahlbyk

+0

안녕하세요. 예. 위와 함께 필요한 변경 사항을 추가하면 작업이 완벽하게 변경됩니다.감사합니다. . – Raj

관련 문제