我想从匿名方法/委托中返回一个字符串值。我怎样才能实现这样的目的:注意这会产生编译时错误:无法将匿名方法转换为'string'类型,因为它不是委托类型
StringBuilder sb = new StringBuilder("aaa");
sb.Replace("aaa", delegate()
{
return "bbb";
});
我也在尝试创建一个扩展方法,所以我可以编写如下代码:
StringBuilder sb = new StringBuilder("aaa");
sb.Replace("aaa", () =>
{
return "bbb";
});
扩展方法的标志是什么?
编辑:
我们有一个庞大的内部类,它会生成繁琐的xml文件。我们希望使该方法更具可读性,而不是其他任何东西。所以我们想去 从:
StringBuilder sb = new StringBuilder(_repository.GetGenericXml1Template());
sb.Replace("$Placeholder", GetXml1Helper());
private void string GetXml1Helper()
{
StringBuilder sb = new StringBuilder(_repository.GetGenericXml2Template());
sb.replace("$Var1", DB.Var1);
....
return sb.ToString();
}
因此,我们希望至少使代码更易读,而不是让几十个辅助方法执行稍微类似的操作。
要:
StringBuilder sb = new StringBuilder(_repository.GetGenericXml1Template());
sb.Replace("$Placeholder", () =>
{
StringBuilder sb = new StringBuilder(_repository.GetGenericXml2Template());
sb.replace("$Var1", DB.Var1);
....
return sb.ToString();
}
);
答案 0 :(得分:1)
您可能希望查看StringBuilder.Replace
,而不是Regex.Replace
。这样你可以做类似的事情:
Regex.Replace("Input string", "aaa", match => "bbb");
非常类似于你想要做的事情,只需开箱即用。
答案 1 :(得分:1)
你必须使用扩展方法来实现预期的..
由于默认的StringBuilder.replace不接受Func<>,您必须创建符合您要求的扩展方法替换
这里是示例代码。
public static class ExtensionMethods
{
public static StringBuilder replace(this StringBuilder Sb1,string input,
Func<string> anonymos)
{
return Sb1.Replace(input, anonymos.Invoke());
}
}
你必须像这样调用扩展替换方法
StringBuilder s1 = new StringBuilder();
s1.Append("hai");
s1.replace("hai", () =>
{
return "bb";
});
希望这会有所帮助。
答案 2 :(得分:0)
这是从匿名方法返回字符串的正确语法。
你的问题是不同的 - 你试图将一个匿名方法传递给StringBuilder.Replace()
作为第二个参数,它需要一个字符串。
为什么你这样做呢?
答案 3 :(得分:0)
注意这会产生编译时错误:无法将匿名方法转换为'string'类型,因为它不是委托类型
你的代表很好 - 错误只是说它不能在这里使用,因为Replace
期望string
作为第二个参数。
扩展方法的标志是什么?
嗯,这样的事情:
static void Replace(this StringBuilder sb, Func<string> f);
- 但你为什么要这个呢?它实现了什么用例?
答案 4 :(得分:0)
我认为您需要扩展现有方法。
请参阅此链接 - &gt; http://msdn.microsoft.com/en-us/library/bb383977.aspx
答案 5 :(得分:0)
您可以执行以下操作:
StringBuilder sb = new StringBuilder();
Func<string> func = delegate()
{
return "HELLO";
};
sb.Replace("", func());
虽然我没有看到这个的使用......
答案 6 :(得分:0)
有点不清楚你将如何使用它 - 因为你发布的例子是微不足道的,我不得不问有什么特别的原因需要它是一个匿名的方法吗?难道它不能只是一个常规的实例方法吗?