Frage

Ich habe folgenden Code:

public static void ProcessStep(Action action)
{
    //do something here
    if (Attribute.IsDefined(action.Method, typeof(LogAttribute)))
    {
        //do something here [1]
    }
    action();
    //do something here
}

Für die einfache Nutzung Ich habe einige ähnlichen Verfahren mit der Methode oben. Zum Beispiel:

public static void ProcessStep(Action<bool> action)
{
    ProcessStep(() => action(true)); //this is only example, don't bother about hardcoded true
}

Aber wenn ich die zweite Methode (das oben) verwenden, auch wenn ursprünglich action-Attribut hatte, Code [1] wird nicht ausgeführt.

Wie kann ich feststellen, wenn Methode ist nur Wrapper und die zugrunde liegende Methode enthält Attribut und wie dieses Attribut zugreifen?

War es hilfreich?

Lösung

Während ich bin sicher, könnten Sie Ausdruck Bäume verwenden, ist die einfachste Lösung wäre, nur eine Überlastung zu schaffen, die einen zusätzlichen Parameter vom Typ Method nimmt und verwenden Sie es wie folgt aus:


public static void ProcessStep(Action<bool> action) 
{ 
    ProcessStep(() => action(true), action.Method); //this is only example, don't bother about hardcoded true 
}

Andere Tipps

Nun, könnten Sie tun ( Ich glaube nicht unbedingt so gut Code ... )

void ProcessStep<T>(T delegateParam, params object[] parameters) where T : class {
    if (!(delegateParam is Delegate)) throw new ArgumentException();
    var del = delegateParam as Delegate;
    // use del.Method here to check the original method
   if (Attribute.IsDefined(del.Method, typeof(LogAttribute)))
   {
       //do something here [1]
   }
   del.DynamicInvoke(parameters);
}

ProcessStep<Action<bool>>(action, true);
ProcessStep<Action<string, string>>(action, "Foo", "Bar")

, aber das sind Sie nicht einen Schönheitswettbewerb gewinnen würde.

Wenn Sie ein wenig mehr Informationen geben könnten, was Sie versuchen, es zu tun wäre einfacher, hilfreiche Ratschläge zu geben ... (weil keine der Lösungen auf dieser Seite sieht wirklich süß)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top