2017-04-18 79 views
-2

我希望能夠在我的lambda表達式中訪問「co」。是否有可能這樣做?如果是的話如何?如果不是,我該怎麼做呢?可以在labda表達式中訪問變量嗎? c#

我想在我的函數「Do」中傳遞一段代碼,在那裏我可以使用「Do」範圍內的變量。

如果你不知道我在說什麼,請問我任何問題,生病試圖更好地解釋。

public static type Do<type>(Func<type> fun) 
    { 
     OracleConnection co = null; 
     type ret = default(type); 
     try 
     { 
      co = CreateCo(); 
      MessageBox.Show("Connected"); 
      ret = fun(); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Error"); 
     } 
     finally 
     { 
      CloseCo(co); 
     } 
     return ret; 
    } 

    public static class Get 
    { 
     public static class Question 
     { 
      public static string byId() 
      { 
       //This lambda expression 
       return Do<string>(() => 
       { co./*here I can't access my object: why? how? */ }); 
      } 
     } 
    } 

,當我得到一個我會更新這個帖子的回答: - >One answer that work !!!

+2

'co'在另一個類中聲明(至少它看起來像你的代碼那樣)。您需要將它作爲當前聲明的類的公共屬性,然後從其他類中訪問它,或者通過構造函數或方法調用將它傳遞給Get類。 –

回答

0

我不明白,你到底要。

但是,如果你撥打:

return Do<string>(() => { }); 

() => {}代表與LAMDA表達的功能。但函數是從你的類型聲明中獨立的。在你的類型聲明中你有一個函數作爲參數,但是這個函數是獨立於你的類型的。

我想,這就是爲什麼你不能訪問「合作」的原因。

更新:

這是您的解決方案嗎?

public static class Get 
{ 
    public static class Question 
    { 
     public static string byId() 
     { 
      Func<OracleConnection, string> func1 = (co) => co.ToString(); 


      return Do<string>(func1); 
     } 
    } 
} 

public static type Do<type>(Func<OracleConnection, type> fun) 
    { 
     OracleConnection co = null; 
     type ret = default(type); 
     try 
     { 
      co = CreateCo(); 
      MessageBox.Show("Connected"); 
      ret = fun(co); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Error"); 
     } 
     finally 
     { 
      CloseCo(co); 
     } 
     return ret; 
    } 
+0

有意義,我想要做的是在「Do」函數中執行一段代碼,並在該代碼塊中能夠訪問「Do」範圍內的變量。 –

+0

我明白你想要什麼。我已經更新了我的答案。我希望它能幫助你。 –

+0

簡而言之,非常感謝,它的工作非常好。 –

相關問題