Como resulta que no es que mucho trabajo usando Expression.Lambda()
. Sin embargo, todavía estoy interesado en posibles otras respuestas.
que tenía necesidad de un método de ayuda que escribí anteriormente:
/// <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);
}
Cuando se tiene EventInfo
puede crear una lambda vacío para ello de la siguiente manera:
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();
Supongo que es por eso que ['Expression.Empty'] (http://msdn.microsoft.com/en-us/library/dd294122.aspx) solo está disponible a partir de C# 4.0? Realmente no estaba buscando convertir una declaración en un árbol de expresiones, sino al revés. Una declaración del árbol de expresiones que da como resultado un delegado 'vacío'. Creo que encontré [_a_ solution now] (http://stackoverflow.com/a/9823691/590790), pero podría estar confundido. :) –
@StevenJeuris: Ah, he entendido mal el impulso de su pregunta. Sí, puede construir un árbol de expresiones "manualmente" que lógicamente es un bloque de instrucciones vacío. No hay forma de que * el compilador de C# * lo haga por usted a través de una conversión lambda, fue mi punto. –