2011-01-10 72 views
2

我如何調用項目以便TestAction寫出「s.Hello」?現在我什麼也沒做,它跳過了「action = s ..」這一行。調用方法的好方法

或者是另一種方式嗎?由於我不想返回任何代碼,因此我使用Action而不是Func

我剛開始使用Action。

public class Items 
{ 
    public string Hello { get; set; } 
} 

public class TestClass 
{ 
    public void TestAction(Action<Items> action) 
    { 
     action = s => Console.WriteLine(s.Hello); 
    } 

    public TestClass() 
    { 
     TestAction(b => b.Hello = "Hello world!"); 
    } 
} 

回答

6

讓我們從堆棧跟蹤的底部向下鑽取您的代碼。

  1. TestAction(b => b.Hello = "Hello world!");

您提供指派b.Hello爲 「Hello World」 的拉姆達。

  1. action = s => Console.WriteLine(s.Hello);

要分配相同的委託一個新的拉姆達。

你實際上沒有對他們做任何事情 - 你只是生成一個委託。要執行該委託,您需要類Items的參數。你真正想要的是致電這樣一個論點的行動。

public class TestClass 
{ 
    public void TestAction(Action<Items> action) 
    { 
     Items i = new Item() { Hello = "Hello World"); 
     action(i); 
    } 

    public TestClass() 
    { 
     TestAction(b => Console.WriteLine(b.Hello)); 
    } 
} 
+0

它不是表達式樹。這將是`Expression >`。除此之外,很好的答案。 – 2011-01-10 00:38:35