2012-03-22 3 views
6

당신은 C# 2.0 이후 빈 대표를 만들 수 있습니다 anonymous methods 사용.표현식 트리를 사용하여 빈 대리자를 만드는 방법은 무엇입니까?

public event EventHandler SomeEvent = delegate {}; 
public event Action OtherEvent = delegate {}; 

useful to prevent having to do the null check when invoking events.

어떻게 Expression Trees를 사용하여 동일한 동작을 만들 수 있습니다 ?

내가 볼 수있는 유일한 옵션은 Expression.Lambda()이지만 지금까지 추가 작업이 많이 필요할 것입니다.

답변

2

이 아니기 때문에Expression.Lambda()을 많이 사용하고 있습니다. 그러나 나는 여전히 가능한 다른 답변에 관심이 있습니다. 당신이 EventInfo이있는 경우는 다음과 같이 당신이 빈 람다를 만들 수 있습니다

/// <summary> 
/// The name of the Invoke method of a Delegate. 
/// </summary> 
const string InvokeMethod = "Invoke"; 

/// <summary> 
/// Get method info for a specified delegate type. 
/// </summary> 
/// <param name = "delegateType">The delegate type to get info for.</param> 
/// <returns>The method info for the given delegate type.</returns> 
public static MethodInfo MethodInfoFromDelegateType(Type delegateType) 
{ 
    Contract.Requires(
     delegateType.IsSubclassOf(typeof(MulticastDelegate)), 
     "Given type should be a delegate."); 

    return delegateType.GetMethod(InvokeMethod); 
} 

: 스티븐 조금 대답 확장

EventInfo _event; 

... 

MethodInfo delegateInfo 
    = DelegateHelper.MethodInfoFromDelegateType(_event.EventHandlerType); 
ParameterExpression[] parameters = delegateInfo 
    .GetParameters() 
    .Select(p => Expression.Parameter(p.ParameterType)) 
    .ToArray(); 
Delegate emptyDelegate = Expression.Lambda(
    _event.EventHandlerType, 
    Expression.Empty(), "EmptyDelegate", true, parameters).Compile(); 
5

식 나무는 그 목적의 성격, 항상 몸에 표현보다는 원래 디자인의 문이있다.

는 C# 3에서 몸 빈 문 블록 인 식 트리를 표현하는 모든 방법이 없었습니다. 최근에는 표현식 트리 라이브러리가 확장 문을 사용할 수 있도록 확장되었지만 C# 의미 분석 규칙이이를 활용하도록 업데이트되지 않았습니다. 당신은 여전히 ​​문장 람다를 표현식 트리로 바꿀 수 없다.

+0

['Expression.Empty'] (http://msdn.microsoft.com/en-us/library/dd294122.aspx)는 C# 4.0부터 사용할 수 있습니다. 저는 진술을 표현 트리로 바꾸고 싶지 않았습니다. 오히려 그 반대 방향이었습니다. '빈'대리자가되는 표현 트리 문입니다. 나는 [_a_ solution now] (http://stackoverflow.com/a/9823691/590790)를 발견했다고 생각하지만 혼란 스러울 수도 있습니다. :) –

+2

@StevenJeuris : 아, 나는 당신의 질문의 추력을 오해. 예, 논리적으로 빈 문장 블록 인 "수동으로"표현식 트리를 구성 할 수 있습니다. C# 컴파일러가 람다 변환을 통해 * 할 수있는 방법이 없습니다. 요점은. –

1

은 내가 이전에 쓴 도우미 메서드를 필요로했다

: 비트 - - 액션과 Func을 유형 - 나는 모두 빈 위임 만들 유사한 기능을 필요로 다음 나는 그 작업을 위해 만든 도우미입니다
관련 문제