Come risulta non è che molto lavoro utilizzando Expression.Lambda()
. Tuttavia, sono ancora interessato a possibili altre risposte.
ho bisogno di un metodo di supporto che ho scritto in precedenza:
/// <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);
}
Quando hai EventInfo
è possibile creare un lambda vuoto per come segue:
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();
fonte
2012-03-22 13:54:45
Immagino che sia il motivo per cui ['Expression.Empty'] (http://msdn.microsoft.com/en-us/library/dd294122.aspx) è disponibile solo a partire da C# 4.0? Non volevo davvero trasformare una frase in un albero di espressione, piuttosto il contrario. Una dichiarazione ad albero delle espressioni che risulta in un delegato 'vuoto'. Penso di aver trovato [_a_ solution now] (http://stackoverflow.com/a/9823691/590790), ma potrei semplicemente essere confuso. :) –
@StevenJeuris: Ah, ho frainteso la spinta della tua domanda. Sì, puoi costruire un albero di espressioni "manualmente" che è logicamente un blocco di istruzioni vuoto. Non c'è modo di fare * il compilatore C# * farlo per te tramite una conversione lambda, era il mio punto. –