3

DynamicXML オブジェクトにいくつか問題があります。XML の解析は良好で、単一要素の場合はうまく機能しますが、子要素が複数ある場合は失敗します。明らかに何かが欠けていますが、何がわかりません。

クラスは次のとおりです。

public class DynamicXml : DynamicObject
{
    readonly XElement element;

    public DynamicXml(string xml)
    {
        element = XElement.Parse(xml);
    }

    public DynamicXml(XElement xElement)
    {
        element = xElement;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (element == null)
        {
            result = null;
            return false;
        }

        var sub = element.Element(binder.Name);

        if (sub == null)
        {
            result = null;
            return false;
        }
        else
        {
            result = new DynamicXml(sub);
            return true;
        }
    }

    public override string ToString()
    {
        return element != null ? element.Value : string.Empty;
    }

    public override bool TryConvert(ConvertBinder binder, out object result)
    {
        try
        {
            result = Convert.ChangeType(element.Value, binder.ReturnType);
            return true;
        }
        catch { }

        return base.TryConvert(binder, out result);
    }
}

これは私がそれを使用する方法です

var response = "<response><foo>some xml here</foo></response>"
result = new DynamicXml(response);

var newObj = new SumObject();
newObj.Foo = result.foo;

これで問題なく動作しますが、xml が次の場合:

<response>
   <foo>
     <bahs>
        <bah>value here</bah>
        <bah>value here</bah>
        <bah>value here</bah>
     </bahs>
   </foo>
<response>

次のようなものを使用したいと思います:

for(var bahs in result.foo.bahs)
{
   //magic code here
}

しかし、これは起こっていることではなく、エラーが発生するだけです:

Cannot implicitly convert type 'DynamicXml' to 'System.Collections.IEnumerable'. An explicit conversion exists (are you missing a cast?)

助けてくれてありがとう。

4

1 に答える 1

3

IEnumerable と GetEnumerator() を実装する必要がありました。

ソリューションクラスは次のとおりです。

    public class DynamicXml : DynamicObject, IEnumerable
    {
        readonly XElement element;

        public DynamicXml(string xml)
        {
            element = XElement.Parse(xml);
        }

        public DynamicXml(XElement xElement)
        {
            element = xElement;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            if (element == null)
            {
                result = null;
                return false;
            }

            var sub = element.Element(binder.Name);

            if (sub == null)
            {
                result = null;
                return false;
            }
            else
            {
                result = new DynamicXml(sub);
                return true;
            }
        }

        public override string ToString()
        {
            return element != null ? element.Value : string.Empty;
        }

        public IEnumerator GetEnumerator()
        {
            return element.Elements().Select(child => new DynamicXml(child)).GetEnumerator();
        }

        public override bool TryConvert(ConvertBinder binder, out object result)
        {
            try
            {
                result = Convert.ChangeType(element.Value, binder.ReturnType);
                return true;
            }
            catch { }

            return base.TryConvert(binder, out result);
        }
    }
于 2012-08-10T13:25:10.760 に答える