【问题标题】:How to return a type from an anonymous method/delegate如何从匿名方法/委托返回类型
【发布时间】:2010-12-06 05:38:10
【问题描述】:

我想从匿名方法/委托返回一个字符串值。我怎样才能实现这样的事情:注意这会产生编译时错误:无法将匿名方法转换为类型“字符串”,因为它不是委托类型

            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();
}
);

【问题讨论】:

  • 签名将是 Func,但您为什么要这样做呢?我相信对于您想要实现的任何目标都有更好的解决方案。
  • @Wololo,你检查我的答案了吗...

标签: c# lambda


【解决方案1】:

您可能想查看Regex.Replace,而不是StringBuilder.Replace。这样您就可以执行以下操作:

Regex.Replace("Input string", "aaa", match => "bbb");

与您想要做的非常相似,开箱即用。

【讨论】:

    【解决方案2】:

    你必须使用扩展方法来达到预期的..

    由于默认的 StringBuilder.replace 不接受 Func,因此您必须创建满足您要求的扩展方法 replace

    这里是示例代码。

    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";
            });
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      注意这会产生编译时错误:Cannot convert anonymous method to type 'string' because it is not a delegate type

      您的委托很好 - 错误只是说它不能在这里使用,因为 Replace 需要 string 作为第二个参数。

      扩展方法的签名是什么?

      嗯,是这样的:

      static void Replace(this StringBuilder sb, Func<string> f);
      

      – 但你为什么要这个?它满足什么用例?

      【讨论】:

      • 我们有一个大类动态创建 xml。我们的 xml 文件是深度嵌套的,所以我没有创建几十个小辅助方法,而是尝试使用匿名方法让它更好地阅读。代表将代表另一个嵌套的 xml 级别。替换方法是用数据库中的值替换 xml 模板文件中的 $Placeholders
      【解决方案4】:

      这是从匿名方法返回字符串的正确语法。 您的问题不同 - 您试图将匿名方法传递给 StringBuilder.Replace() 作为第二个参数,它需要一个字符串。

      你为什么要这样做?

      【讨论】:

        【解决方案5】:

        我认为你需要扩展现有的方法。

        请参考此链接 --> http://msdn.microsoft.com/en-us/library/bb383977.aspx

        【讨论】:

          【解决方案6】:

          您可以执行以下操作:

          StringBuilder sb = new StringBuilder();
          Func<string> func = delegate()
          {
              return "HELLO";
          };
          sb.Replace("", func());
          

          虽然我没有看到这个的用途...

          【讨论】:

          • 你没有抓住重点,他想创建一个允许这样做的扩展方法,他的匿名方法很好。
          • 嗯,他写道,他也想创建一个“扩展方法”,所以我认为这只是第二个问题。
          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多