C# 如何将要在某些元素上执行的操作作为参数传递?

C# 如何将要在某些元素上执行的操作作为参数传递?,c#,json,xml,xpath,C#,Json,Xml,Xpath,请原谅这个令人困惑的问题,因为我没有足够的空间来清楚地描述它 我们有一个库函数SerializeXelement,它接受某个XML结构的根XElement,执行一个处理步骤,并以JSON格式返回它 此处理步骤是用于单一目的的特定步骤(向特定元素添加属性,由传递到此函数的XPath数组参数指定IEnumerable ensureNodeArray=null (该功能如下所示,如上所述) 我最近要求此函数执行另一个不同的处理步骤,因此我通过添加另一个XPath字符串集合来重载此函数,Serializ

请原谅这个令人困惑的问题,因为我没有足够的空间来清楚地描述它

我们有一个库函数
SerializeXelement
,它接受某个XML结构的根XElement,执行一个处理步骤,并以JSON格式返回它

此处理步骤是用于单一目的的特定步骤(向特定元素添加属性,由传递到此函数的XPath数组参数指定
IEnumerable ensureNodeArray=null
(该功能如下所示,如上所述)

我最近要求此函数执行另一个不同的处理步骤,因此我通过添加另一个XPath字符串集合来重载此函数,
SerializeXelement
为其调用另一个helper函数进行处理

我想知道是否有更好的方法来处理这一问题,以防将来出现许多处理步骤

问题是:c#中是否有任何东西可以帮助我传递一组匿名函数,这些匿名函数将在一组特定的xml元素上执行?因此,每个应用程序都使用这个库函数(有很多函数,它们的使用方式非常不同)可以选择在转换为JSON之前对XML文档执行什么操作

上述库函数:

public static string SerializeXelement(XElement xEl, IEnumerable<string> ensureNodeArray = null, 
    bool removeAttrSymbol = true, Formatting formatting = Formatting.None, bool omitRootObject = false)
{
    if (ensureNodeArray != null)
    {
        AddArrayAttributes(xEl, ensureNodeArray);
    }

    var output = JsonConvert.SerializeXNode(xEl, formatting, omitRootObject);
    if (removeAttrSymbol) { output = output.RemoveJsonXmlAttributeSymbols(); }
    return output;
}

private static void AddArrayAttributes(XElement xEl, IEnumerable<string> nodeArray)
{
    XNamespace ns = "http://james.newtonking.com/projects/json";
    xEl.Add(new XAttribute(XNamespace.Xmlns + "json", ns));

    // Add array attribute to all relevent nodes
    foreach (var nde in nodeArray.Select(xEl.XPathSelectElements).SelectMany(ndes =>
    {
        var xElements = ndes as XElement[] ?? ndes.ToArray();
        return xElements;
    }))
    {
        nde.Add(new XAttribute(ns + "Array", "true"));
    }
}
publicstaticstringserializeXelement(XElement-xEl,IEnumerable-ensureNodeArray=null,
bool removeAttrSymbol=true,Formatting=Formatting.None,bool omit rootobject=false)
{
如果(光线!=null)
{
AddArrayAttributes(xEl,ensureNodeArray);
}
var output=JsonConvert.SerializeXNode(xEl,格式化,省略rootobject);
if(removeAttrSymbol){output=output.RemoveJsonXmlAttributeSymbols();}
返回输出;
}
私有静态void AddArrayAttributes(XElement xEl、IEnumerable noderray)
{
XNS=”http://james.newtonking.com/projects/json";
Add(新的XAttribute(XNamespace.Xmlns+“json”,ns));
//将数组属性添加到所有相关节点
foreach(noderray.Select(xEl.XPathSelectElements)中的var nde)。SelectMany(ndes=>
{
变量xElements=无损检测为XElement[]??无损检测。ToArray();
返回元素;
}))
{
nde.Add(新的X属性(ns+“数组”、“真”);
}
}

将xml处理器作为
操作传递给调用它的人

public static string SerializeXelement(Action<XElement, IEnumerable<string>> xmlProcessor, XElement xEl, IEnumerable<string> ensureNodeArray = null, 
    bool removeAttrSymbol = true, Formatting formatting = Formatting.None, bool omitRootObject = false)
{
    if (xmlProcessor != null)
    {
        xmlProcessor(xEl, ensureNodeArray);
    }

    var output = JsonConvert.SerializeXNode(xEl, formatting, omitRootObject);
    if (removeAttrSymbol) { output = output.RemoveJsonXmlAttributeSymbols(); }
    return output;
}

我投票结束这个问题,因为可能更适合于
代码审查
@MethodMan我不同意,我可能已经做了比必要的更多的细节,以向读者提供完整的背景,但问题本身很简洁,你能不能不代表这个行动…?这正是我基于t的想法他是OP的标题和问题描述。我唯一要更改的是将其列成一个列表,这样他就可以传递任意一组操作。@Jakotheshadows-传递操作列表是不必要的。因为操作是多播委托,所以只需添加它们即可获得相同的效果,即
var xmlProcessor=xmlProcessor2+xmlProcessor1
Hamlet我需要能够为每个操作传递不同的
IEnumerable
。它是xpath字符串的集合,指定要对哪些XML元素执行该操作。对于每个操作,它将是不同的集合。我如何才能做到这一点?
SerializeXelement(AddArrayAttributes, xmlRoot, ...);