簡體   English   中英

如何從匿名方法/委托返回類型

[英]How to return a type from an anonymous method/delegate

我想從匿名方法/委托中返回一個字符串值。 我如何實現這樣的目標:請注意,這將產生編譯時錯誤:無法將匿名方法轉換為類型的“字符串”,因為它不是委托類型

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

您可能要查看Regex.Replace而不是StringBuilder.Replace 這樣,您可以執行以下操作:

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

開箱即用,與您要執行的操作非常相似。

您必須使用擴展方法來達到預期的效果。

由於默認的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());
          }
}

並且您必須像這樣調用擴展方法replace

        StringBuilder s1 = new StringBuilder();
        s1.Append("hai");
        s1.replace("hai", () =>
        {
            return "bb";
        });

希望這可以幫助。

這是從匿名方法返回字符串的正確語法。 您的問題有所不同-您嘗試將匿名方法傳遞給StringBuilder.Replace()作為第二個參數,該參數需要一個字符串。

你為什么要這樣做?

請注意,這將產生編譯時錯誤:無法將匿名方法轉換為類型的字符串,因為它不是委托類型

您的代表很好-錯誤僅表示不能在此處使用,因為Replace期望將string作為第二個參數。

擴展方法的含義是什么?

好吧,像這樣:

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

–但是你為什么要這個? 它滿足什么用例?

我相信您需要擴展現有方法。

請參考此鏈接-> http://msdn.microsoft.com/zh-cn/library/bb383977.aspx

您可以執行以下操作:

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

雖然我看不到有這個用途...

尚不清楚您將如何使用它-由於您發布的示例很簡單,我必須問是否有任何特殊原因需要將其用作匿名方法? 難道它不是常規實例方法嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM