2011-01-10 2 views
2

어떻게해야합니까? TestAction이 "s.Hello"를 작성하도록 항목을 호출하는 방법은 무엇입니까? 지금은 아무 것도하지 않고, "action = s .."줄로 넘어갑니다.작업 방법에서 호출하는 좋은 방법

아니면 다른 방법이 있습니까? 어떤 코드를 반환하고 싶지 않기 때문에 Func 대신 Action을 사용합니다.

방금 ​​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를 할당 람다를 공급하고 있습니다.
  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 >'입니다. 그 외에, 좋은 대답. –

+0

람다 자체는 하나입니다. 그러나 나는 그것에 대해 잘못 될 수 있습니다 ... 적어도 표현식 트리를 사용하여 수행 한 작업에 대한 인상을 받았습니다. (작성하고 .Compile()을 통해 델리 게이트를 작성하십시오.) 델리게이트와 언급을 교환했습니다. 그러나 확실하지는 않습니다. – Femaref

+0

이 코드는 트리를 생성하고 컴파일하지 않습니다. 컴파일은 컴파일 타임에 완료됩니다 (이상하게 들리 네요.) System.Linq.Expressions 네임 스페이스의 클래스가이 클래스에서 사용되지 않습니다. 코드. –