1

次の XML 要素をデシリアライズしたいと思います。

<error code="1" type="post">
  <bad-request xmlns="blah:ns"> // <-- may be some different element name
    <text>You fail.</text> // <-- this is optional
  </bad-request>
</error>

子要素bad-requestには、いくつかの異なる名前を付けることができます。その要素名を、次のように名前空間で列挙として定義されているエラー型にデシリアライズしたいと思います。

public enum ErrorType { BadRequest = 1, Forbidden = 2, Blah = 3, ... }

textさらに、 ' 要素のテキストをプロパティに解析したいと考えていErrorTextます。したがって、私の最終クラスはそのようになります。

public class Error 
{
  public string ErrorText { get; set; }
  public ErrorType ErrorType { get; set; }
}

C# と逆シリアル化でこのようなことを達成するにはどうすればよいですか?

更新

私の現在のソリューションは、やり過ぎのように思えます。

public class Error
{

    private string _type;

    [XmlAttribute("type")]
    public string Type // <-- there is clearly a bug in here I should not do that on the type attribute because it has nothing to do with the error type
    {
        get { return _type; }

        set
        {
            _type = value;

            switch (value)
            {
                case "bad-request":
                    ErrorType = ErrorTypes.BadRequest;
                    ErrorText = BadRequest.Text.Value;
                    break;                    
                default:
                    ...
                    break;
            }
        }
    }

    public ErrorTypes ErrorType { get; set; }
    public string ErrorText { get; set; }

    [XmlElement("bad-request")]
    public BadRequest BadRequest { get; set; }

}

public enum ErrorTypes 
{ 
    BadRequest = 0,
    Conflict = 1,
    FeatureNotImplemented = 2,
    Forbidden = 3
}

public class Text 
{
    [XmlText]
    public string Value { get; set; }
}

public class BadRequest
{        
    [XmlElement("text")]
    public Text Text { get; set; }
}

上記のコードでは、要素の名前/タイプごとに個別のクラスが必要になります。

4

1 に答える 1