2010-11-25 6 views
1

XML을 C# 클래스로 캡슐화하는 우아한 방법을 찾으려고합니다. 주위를 둘러 보면서, 어딘가에 Java 예제를 발견했습니다. (이 시점에서 어디에서 묻지 마십시오.) 아이디어가 떠오르지 만, C#에서도 가능한지 확실하지 않습니다.중첩 된 XML 캡슐화

현재 사용하고있는 우아한 방법은 적절한 노드가 발견되면 어떻게 해야할지를 나타내는 전체 일련의 중첩 된 switch 문을 사용하여 XPathNodeIterator/XPathNavigator 노드를 반복하고 처리되지 않은 노드를 나열하는 것입니다. 필자가 시도하고있는보다 우아한 메소드는 헬퍼 클래스를 사용하여 대량의 반복 작업을 수행하고 기본적으로 노드 이름과 해당 노드가 발생할 때 취할 조치를 취한다. 그 클래스 (이 이론적 있습니다 이유를 아래 참조) 현재 다음과 같습니다 심지어 개념 증명 시험에 도착하기 전에

class XmlNodeIterator 
{ 
    public XmlNodeIterator(XPathNodeIterator node, Dictionary<string, Action> children) 
    { 
     foreach (XPathNavigator childNode in node.Current.SelectChildren(XPathNodeType.Element)) 
     { 
      Action child = null; 
      try 
      { 
       child = children[childNode.LocalName]; 
      } 
      catch (KeyNotFoundException e) 
      { 
       // Log the warning in some fashion 
      } 
      if (child != null) 
       child.Invoke(); 
     } 
    } 
} 

, 나는 개념에 문제가 있음을 발견했다. :) 대리자 함수에서 내부 childNode (예 : childNode.Value 또는 childNode.GetAttribute)에 액세스하고이를 외부 변수 또는 속성에 할당하려면 어떻게해야합니까?

저는 아직 일반 대표자에게 새로운 것이므로 가능한지 전혀 모르겠습니다. 그것이라면, 대단해! 그렇지 않다면 내가 시도 할 수있는 다른 우아한 해결책이 있습니까? 또는 중첩 스위치 만 사용해야합니까?

답변

4

Action 대신 Action<T>을 사용하는 것이 좋습니다. Invoke 메서드는 매개 변수로 호출 할 수 있습니다.

Action<XPathNavigator> child = null; 
... 
child.Invoke(childNode); 

아니면 어떤 외부의 값을 할당 할 경우 같은 Func<T1,T2>를 사용할 수 있습니다 : 귀하의 경우 2 예에서와 같이

Func<XPathNavigator, string> child = null; 
... 
var value = child(childNode); 

, BTW, 직접 호출 호출은 omited 할 수 있습니다. 우리는 단순히 그것을 메서드로 부름시킬 수 있습니다.

+0

그게 제가 찾고 있던 것이고, 이제는 그것을 얻었습니다. 개념이 제대로 작동 할 것처럼 보입니다. 감사! – RobinHood70

+0

FxCop은 사전 >의 중첩 된 제네릭에 대해 귀찮게합니다. 당장은 그냥 떠날거야. – RobinHood70

+0

다행) 나는 행운을 빌어 요. – ILya