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

本文关键字:Action 代码 Microsoft 包含 使用 重写 System | 更新日期: 2023-09-27 18:21:36

旧项目有类似的代码

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框架3.5中,因此System.Action只接受4个参数并出错:

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

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

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

好的,大家好,.NET 3.5!

您可以定义自己的委托来绕过.NET3.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) =>
    {
      ...
    };

这个解决方案可能比普库德罗夫的答案侵入性更小,普库德罗夫正是另一个好的选择。这取决于你来决定哪一个更适合你自己的情况。

由于注释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的主体以满足此转换。