Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用动态类型的流畅XML翻译_C#_Xml_Dynamic - Fatal编程技术网

C# 使用动态类型的流畅XML翻译

C# 使用动态类型的流畅XML翻译,c#,xml,dynamic,C#,Xml,Dynamic,根据凯文·哈扎德在这里的帖子; 我试着用逻辑。基本上,这应该做的是获取一段XML并将其转换为您可以使用的对象。例如,假设我的xml是 <someObject> <Name>Timmy</Name> </someObject> 在谷歌搜索了很多次之后,我发现了Kevin的博客,并发布了一个DynamicXml对象,该对象应该可以完成这项工作,但我无法让它工作,或者我没有正确地使用它。我对.NET的Expando对象的理解是有限的,除了博客文

根据凯文·哈扎德在这里的帖子; 我试着用逻辑。基本上,这应该做的是获取一段XML并将其转换为您可以使用的对象。例如,假设我的xml是

<someObject>
    <Name>Timmy</Name>
</someObject>
在谷歌搜索了很多次之后,我发现了Kevin的博客,并发布了一个DynamicXml对象,该对象应该可以完成这项工作,但我无法让它工作,或者我没有正确地使用它。我对.NET的Expando对象的理解是有限的,除了博客文章之外,我没有代码示例。我把凯文关于这个主题的两篇博文整理成一个单独的对象,即:

public class DynamicXml : DynamicObject, IEnumerable
{
    private readonly List<XElement> _elements;

    public DynamicXml(string text)
    {
        var doc = XDocument.Parse(text);
        _elements = new List<XElement> { doc.Root };
    }

    protected DynamicXml(XElement element)
    {
        _elements = new List<XElement> { element };
    }

    protected DynamicXml(IEnumerable<XElement> elements)
    {
        _elements = new List<XElement>(elements);
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = null;

        // handle the Value and Count special cases
        if (binder.Name == "Value")
        {
            result = _elements[0].Value;
        }
        else if (binder.Name == "Count")
        {
            result = _elements.Count;
        }
        else
        {
            // try to find a named attribute first
            var attr = _elements[0].Attribute(XName.Get(binder.Name));
            if (attr != null)
            {
                // if a named attribute was found, return that NON-dynamic object
                result = attr;
            }
            else
            {
                // find the named descendants 
                var items = _elements.Descendants(
                    XName.Get(binder.Name));
                if (items != null && items.Count() > 0)
                {
                    // prepare a new dynamic object with the list of found descendants
                    result = new DynamicXml(items);
                }
            }
        }

        if (result == null)
        {
            // not found, create a new element here 
            _elements[0].AddFirst(new XElement(binder.Name));
            result = new DynamicXml(_elements[0].Descendants().First());
        }
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (binder.Name == "Value")
        {
            /* the Value property is the only one that may be modified. TryGetMember actually
                creates new XML elements in this implementation */
            _elements[0].Value = value.ToString();
            return true;
        }
        return false;
    }

    public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
    {
        int ndx = (int)indexes[0];
        result = new DynamicXml(_elements[ndx]);
        return true;
    }

    public IEnumerator GetEnumerator()
    {
        foreach (var element in _elements)
            yield return new DynamicXml(element);
    }
}
例外情况是

Cannot implicitly convert type 'MyProject.Common.Exchange.DynamicXml' to 'string'

当我检查对象时,它似乎是一系列嵌套的DynamicXml——从代码的内部来看,这似乎是正确的。所以我想知道我是如何得到这个值名的?根据博客的说法,应该是payload.Name。想法?

您错过了一件非常重要的事情:您可以按名称调用节点,但必须取消引用它的值,因为getMember总是返回DynamicXml对象

尝试:


您错过了一件非常重要的事情:您可以按名称调用节点,但必须取消引用它的值,因为getMember总是返回DynamicXml对象

尝试:

dynamic payload = new DynamicXml(PayloadData);
Name = payload.Name;    // error thrown here
Cannot implicitly convert type 'MyProject.Common.Exchange.DynamicXml' to 'string'
payload.Name.Value