이 아니기 때문에은 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();
['Expression.Empty'] (http://msdn.microsoft.com/en-us/library/dd294122.aspx)는 C# 4.0부터 사용할 수 있습니다. 저는 진술을 표현 트리로 바꾸고 싶지 않았습니다. 오히려 그 반대 방향이었습니다. '빈'대리자가되는 표현 트리 문입니다. 나는 [_a_ solution now] (http://stackoverflow.com/a/9823691/590790)를 발견했다고 생각하지만 혼란 스러울 수도 있습니다. :) –
@StevenJeuris : 아, 나는 당신의 질문의 추력을 오해. 예, 논리적으로 빈 문장 블록 인 "수동으로"표현식 트리를 구성 할 수 있습니다. C# 컴파일러가 람다 변환을 통해 * 할 수있는 방법이 없습니다. 요점은. –