使用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
好的,大家好,.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的主体以满足此转换。