如何从匿名方法/委托中返回一个类型

时间:2009-10-13 07:37:56

标签: c# lambda

我想从匿名方法/委托中返回一个字符串值。我怎样才能实现这样的目的:注意这会产生编译时错误:无法将匿名方法转换为'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();
}
);

7 个答案:

答案 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)

有点不清楚你将如何使用它 - 因为你发布的例子是微不足道的,我不得不问有什么特别的原因需要它是一个匿名的方法吗?难道它不能只是一个常规的实例方法吗?