enumerable.tolist <> ()를 목록으로 삼는 방법 <>
-
05-07-2019 - |
문제
나는 다음과 같이 보이는 객체를 만들려고 노력하고 있습니다.
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>();
}
}