事实证明,它不是,使用Expression.Lambda()
很多工作。不过,我仍然对其他可能的答案感兴趣。
我确实需要一个辅助方法,这是我以前写的:
/// <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
你可以为它,如下所示创建一个空的λ:
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_解决方案](http://stackoverflow.com/a/9823691/590790),但我可能会感到困惑。 :) – 2012-03-22 14:03:49
@StevenJeuris:啊,我误解了你的问题的主旨。是的,您可以构建一个逻辑上为空语句块的“手动”表达式树。没有办法让* C#编译器*通过lambda转换为您做到这一点,这是我的观点。 – 2012-03-22 14:49:44