使用System.Action委托重写包含Microsoft.Action委托的代码

时间:2014-09-12 14:55:58

标签: c# .net

旧项目的代码类似于

Microsoft.Action<StringBuilder, string, string, string, bool> appendTag = 
    (StringBuilder sb, string tagName, string curVal, string priorVal, 
        bool checkPrior) =>
        {
            if (generateEmptyTags || curVal != string.Empty)
            {
                sb.Append("<");
                sb.Append(tagName);

                if (checkPrior && (generateEmptyTags || foundPrior))
                {
                    sb.Append(" prior_value=\"");
                    sb.Append(priorVal.XmlEncoded());
                    sb.Append("\"");
                }
                sb.Append(">");
                sb.Append(curVal.XmlEncoded());
                sb.Append("</");
                sb.Append(tagName);
                sb.Append(">");
            }
        };

目前删除了Microsoft对象的引用,因此有人可以帮助使用Lambda和Linq重写内联函数,而不需要Microsoft.Action委托。新的内联函数应该接受四个参数 不知道Lambda和Linq所以需要帮助。

该项目位于.Net framework 3.5中,因此System.Action仅接受4个参数和错误:

我也尝试过System.Action,但它给出了编译错误        System.Action'需要'4'类型参数。

所以现在需要帮助来编写我自己的内联函数,它将取代Microsoft.Action

2 个答案:

答案 0 :(得分:2)

好的,你好.NET 3.5!

您可以定义自己的委托以绕过.NET 3.5限制:

public delegate void Action<T1,T2,T3,T4,T5>
  (StringBuilder arg1, string arg2, string arg3, string arg4, bool arg5);

鉴于此,以下代码将编译:

Action<StringBuilder, string, string, string, bool> appendTag =
  (StringBuilder sb, string tagName, string curVal, string priorVal, bool checkPrior) =>
    {
      ...
    };

这个解决方案可能比pkuderov的答案更少侵入,这是另一个好的选择。这取决于你确定哪一个更适合你自己的情况。

答案 1 :(得分:1)

由于该评论look at the error System.Action<T1,T2,T3,T4>' requires '4' type argument This error I get when I compile. I am using .net framework 3.5我建议你减少参数数量为2 创建将容纳string tagName, string curVal, string priorVal, bool checkPrior的结构并将其对象传递给Action<StringBuilder, YourStruct>并重构lambda的主体以满足此转换。