문제

나는 다음과 같이 보이는 객체를 만들려고 노력하고 있습니다.

  public class MyObject
  {
    private IList<AnotherObject> items;
    public List<AnotherObject> Items
    {
      return items.AsEnumerable().ToList<AnotherObject>();
    }
  }

나는 nhibernate를 내 dal로 사용하고 있으며 항목 필드에 직접 매핑하고 모든 것이 잘 작동합니다.

또한 Windows Workflow를 사용하고 있으며 Replicator 활동은 일반 ILIST에서 작동하지 않습니다. (http://social.msdn.microsoft.com/forums/en-us/windowsworkflowfoundation/thread/2ca74b60-fd33-4031-be4b-17a79e9afe63) 이것은 기본적으로 ILIST <> 대신 목록 <> 래퍼를 사용하도록 강요합니다. 이것은 NHibernate의 ILIST 구현을 목록에 직접 캐스트 할 수 없으므로 직접 NHibernate 매핑을 중단합니다.

** 편집 : Windows 워크 플로우 요구 사항은 실제로 ILIST가 필요한지 상관없이 목록에 대한 유형 안전 액세스를 잃게 될 것임을 의미합니다.

이제 목표는이 객체를 직렬화/사형화하는 것입니다. 이것은 바이너리 직렬화와 잘 작동하지만 기본 NHibernate 프록시 객체는 필자화하려고 할 때 nhibernate 오류로 폭발합니다.

그래서 XML 직렬화를 시도했습니다. 직렬화는 잘 작동하며 직렬화 된 XML 파일의 멋진 콘크리트 클래스 정의를 제공하여 nhibernate 프록시를 완전히 제거합니다. 그러나이를 제외 시키려고 시도 할 때 항목을 항목에 추가 할 수 없습니다.

누구든지 이것에 대한 생각이 있습니까? 내가 이것에 대해 잘못된 길로 가고 있습니까?

** 편집 : nhibernate 콘크리트 클래스는 nhibernate.collection.generic.persistentgenericbag입니다. 실제로 Ilist를 직접 구현합니다. 그러나 일반 목록의 모든 유형 안전 혜택을 잃었습니다. 이것은 각 어린이 물체에 대한 래퍼를 작성해야한다는 영역으로 되돌아 가며 가능한 경우 그 사실을 피하고 싶었습니다.

도움이 되었습니까?

해결책

옵션은 ILIST를 구현하는 인스턴스 주위에 래퍼 인 고유 한 CustomList 구현을 작성하는 것입니다.

즉:

public CustomList<AnotherObject> Items    
{      
    return new CustomList<AnotherObject>(items); 
}

즉, 당신이 당신의 추가 할 때 CustomList<T> 후원 목록에 추가됩니다.

수업이 구현되는 한처럼 들립니다 IList 만큼 잘 IList<T> 당신은 괜찮을 것입니다.

다른 팁

예, 불행히도 당신은 이런 식으로 갈 수 없습니다. 부름 ToList() 목록의 새로운 인스턴스를 작성하므로 해당 인스턴스에 항목을 추가하면 원래 목록에 반영되지 않습니다 (명확하게 발견 한대로).

나는 nhibernate를 사용하지 않지만 당신의 컨테이너가 구현되는지 궁금 할 것입니다. IList (비 게 릭 버전). 당신이 참조한 스레드에서, 그것은 나타납니다 System.Collections.IList 실제로 필요한 것입니다 (그리고 그것은 List<T>, 그것이 작동하는 이유입니다). 컨테이너가 구현됩니다 IList?

이렇게 캐스팅 할 수 없습니까?

public class MyObject
{
    private IList<AnotherObject> items;
    public List<AnotherObject> Items()
    {
        return (List<AnotherObject>)items;
    }
}

Chanse가 그것을 시험해 보지 못했지만 효과가 있다고 생각합니다!

Nhibernate Persistentbag (비 게 니체) 컬렉션이 구현된다고 생각합니다. IList 따라서 항목을 다음과 같이 입력 할 수 있습니다 IList 대신에 IList<AnotherObject>. 질문의 링크는 문제는 복제기가 ilist가 필요하다는 것입니다. List<T> 구현이지만 IList<T> 그렇지 않습니다 (그림).

ienumerable로 캐스트 될 수 있습니다u003CT> ? 당신은 이것을 시도 할 수 있습니다 :

public class MyObject
{
    private IList<AnotherObject> items;
    public List<AnotherObject> Items
    {
        return new List<AnotherObject>items.Cast<AnotherObject>());
    }
    // or, to prevent modifying the list
    public IEnumerable<AnotherObject> Items
    {
        return items.Cast<AnotherObject>();
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top