2011-03-22 2 views
0

다음은 제 시나리오입니다. 다음 클래스가 있습니다. 생성자가 클래스의 일부 요소를 deserialize하도록하고 싶습니다. 나는 여기서 팩토리 메소드를 사용하지 않을 것이다.이미 존재하는 객체를 구성하기 위해 XML 스 니펫을 비 직렬화 할 수 있습니까?

public abstract class AccessLevelAgentBase : IAccessLevelAgent 
{ 
    public List<AccessLevel> AccessLevels { get; set; } 

    [XmlElement] 
    public string PasswordPrompt { get; set; } 

    [XmlElement] 
    public string GetAccessLevelKeystroke { get; set; } 

    [XmlElement] 
    public int Doohicky { get; set;} 

    public AccessLevelAgentBase(XElement agentElement) 
    { 
     // Some Mojo Here to take agentElement and serialize 
     // from the XML below to set the values of PasswordPrompt, 
     // GetAccessLevelKeystroke, and Doohicky. 
    } 
} 

는 XML :

<AccessLevelAgent> 
    <PasswordPrompt> Password ?: </PasswordPrompt> 
    <PromptCommand>Ctrl+X</PromptCommand> 
    <Doohicky>50</Doohicky> 
</AccessLevelAgent> 
+1

찾으시는 것입니까? –

+0

고마워, 내 잘못 :-P – Firoso

+0

처음부터 완전히 직렬화 된 객체를 가져 오는 것을 방해하는 것이 있습니까? – canon

답변

3

간단한 방법 ...

public AccessLevelAgentBase(XElement agentElement)  
{ 
    this.AccessLevels = (string)agentElement.Element("AccessLevels"); 
    this.GetAccessLevelKeystroke = (string)agentElement.Element("GetAccessLevelKeystroke"); 
    this.Doohicky = (int)agentElement.Element("Doohicky"); 
} 

... 그리 간단한 방법 ... 당신이 역 직렬화

public AccessLevelAgentBase(XElement agentElement) 
{ 
    var type = this.GetType(); 
    var props = from prop in type.GetProperties() 
       let attrib = prop.GetCustomAttributes(typeof(XmlElementAttribute), true) 
            .OfType<XmlElementAttribute>() 
            .FirstOrDefault() 
       where attrib != null 
       let elementName = string.IsNullOrWhiteSpace(attrib.ElementName) 
              ? prop.Name 
              : attrib.ElementName 
       let value = agentElement.Element(elementName) 
       where value != null 
       select new 
       { 
        Property = prop, 
        Element = value, 
       }; 

    foreach (var item in props) 
    { 
     var propType = item.Property.PropertyType; 
     if (propType == typeof(string)) 
      item.Property.SetValue(this, (string)item.Element, null); 
     else if (propType == typeof(int)) 
      item.Property.SetValue(this, (int)item.Element, null); 
     else 
      throw new NotSupportedException(); 
    } 
} 
+0

그것은 "간단한"방법이지만 일반적으로 클래스의 속성을 살펴보고 싶습니다. – Firoso

+0

그러면 리플렉션을 사용해야 할 것입니다. –

+0

해당 인상을 받기 시작 했으므로 개체의 인스턴스에서 전달한 수동 "도우미"를 만들어 평가 한 다음 발견 된 XML 요소를 설정하십시오. – Firoso

관련 문제