2014-06-16 1 views
2

나는 클래스 FooSystem.Xml.Linq.XElement을 확장,하지만 내가 호출 할 때 확장 System.Xml.Linq.XElement - 내부 CloneNode

Foo parent = ..; Foo child = ..; parent.Add(child);

는 아이가이 유형 XElement이며, 유형 Foo이 아닌 덧붙였다. Add 방법 내에서 호출되는 internal abstract XNode CloneNode()의 때문에

입니다.

나는 때문에 내부의이 무시할 수 없습니다. 이 경우 내 옵션은 무엇입니까? CloneNode()을 호출하는 각 함수를 재정의하고 싶지 않습니다. 대한

+0

당신이 서브 클래스'Foo'를 사용하여 추가하려는 코드는 무엇입니까? 생성 프로세스를 액세스하거나 수정할 수없는 것으로 보인다고해서 다른 기술을 사용하여 'XElement'를 확장하는 것이 가능할 수도 있습니다. –

+0

각 노드에 몇 가지 추가 메타 데이터를 추가하려고합니다.이 구조의 탐색, 검색 및 기타 작업을 위해 Xml.Linq 기능을 유지하는 것이 좋습니다. 나는 이것을하기 위해 wrapper를 만들 필요가 있다고 생각하지만 XElement를 확장하는 것보다 훨씬 많은 코드가 필요하다. 여분의 멤버가 필요하기 때문에 Extension 메서드를 사용할 수 없습니다. – watbywbarif

+0

더 많은 임시 해결 방법 ... 가능한 한 클래스'Foo'를 사용하고 필요에 따라'XElement'로 변환하는 것은 어떻습니까? 그리고 전환으로 모든 추가 정보가 추가됩니다. –

답변

0

지금은 그냥 현재의 코드를 패치, 일반적으로 작동하지 않는, 더 솔루션보다 일시적으로 해킹처럼 못생긴 해결책을 가지고 있습니다. XElement를 확장하지 않고 코드를 다시 작성하는 것 외에 다른 멋진 솔루션이 있는지 확신 할 수 없으므로 게시 할 예정입니다.

CloneNode은 부모 필드가 null가 아닌 경우에만 추가로 호출되지만 부모의 속성은 얻을 수 있으며, 부모 필드는 내부입니다. 그래서 내 문제를 해결하는 가장 쉬운 방법은 XElement를가 XElementExtended에두고 추가 숨기는 것입니다 : 엔티티로

static FieldInfo parentProperty = typeof(XElementExtended).GetField("parent", 
      BindingFlags.NonPublic | BindingFlags.Instance); 
public void Add(XElementExtended element) 
{ 
    var el = new XElementExtended(element); 
    parentProperty.SetValue(el, null); 
    base.Add(el); 
} 
+0

나는이 문제를 CloneNode의 리플렉션 및 방출과 함께 재생함으로써 더 잘 해결하려고 노력할 수는 있지만 이것은 더 복잡하며 예상대로 작동하는지 확신 할 수 없습니다. 수정 사항을 좀 더 일관성있게 만들 수 있다고해도 여전히 추한 것입니다 ( – watbywbarif

0

하여 XElement는 XML 모델 자체의 일부입니다. 새로운 종류의 노드처럼 XML에 일부 기능을 추가하는 경우이를 확장 할 수 있습니다. 그리고 심지어 XNode 구현은 새 XML에 대해 전혀 모르기 때문에 여전히 정확합니다. 늘어나는 XML은 확장 할 수 없다는 것을 알고 있습니다. 예를 들어, 새로운 종류의 노드를 추가 할 수 없습니다.

당신이 당신의 XML 데이터를 유형화하려는 경우 다음 올바른 방법은 루트 엔티티에/쓰기 방법을 개별적으로 판독 데이터 모델을 구축하고 구현하는 것입니다.

요소에 태그를 지정하려면 XDocument에서 전체 모델에 대한 래퍼를 작성하거나 측면에 정보를 Dictionary<XElement, something>으로 색인화해야합니다.

관련 문제