Come creare un delegato vuoto usando Expression Trees?

c# delegates events expression-trees

Domanda

Utilizzando metodi anonimi è possibile creare delegati vuoti da C # 2.0.

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

Ciò è utile ad esempio per evitare di dover eseguire il controllo Null quando si invocano eventi .

Come posso creare lo stesso comportamento usando Expression Trees ?

L'unica opzione possibile che vedo ora è usare Expression.Lambda() , ma per quanto posso dire questo richiederebbe molto lavoro extra.

Risposta accettata

A quanto pare non è molto che si usi Expression.Lambda() . Tuttavia, sono ancora interessato a possibili altre risposte.

Avevo 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 puoi creare un lambda vuoto 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();

Risposta popolare

Un albero di espressione, per natura del suo scopo, ha sempre un'espressione per un corpo piuttosto che un'affermazione nel disegno originale.

In C # 3 non c'era assolutamente modo di esprimere un albero di espressioni il cui corpo fosse un blocco di istruzioni vuoto. Più recentemente, la libreria dell'albero delle espressioni è stata estesa per consentire le istruzioni, ma le regole di analisi semantica del C # non sono state aggiornate per trarne vantaggio; non riesci ancora a trasformare una frase lambda in un albero delle espressioni.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché