Pergunta

Eu tenho o seguinte código:

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

Para facilitar o uso, tenho alguns métodos semelhantes usando o método acima. Por exemplo:

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

Mas quando eu uso o segundo método (o acima), mesmo que a ação original tenha atribuído, o código [1] não será executado.

Como posso encontrar se o método é apenas wrapper e o método subjacente contém atributo e como acessar esse atributo?

Foi útil?

Solução

Embora eu tenha certeza de que você poderia usar árvores de expressão, a solução mais fácil seria apenas criar uma sobrecarga que pegue um parâmetro adicional do tipo MethodInfo e usá -lo assim:


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

Outras dicas

Bem, você poderia fazer (Eu não acho necessariamente que este seja um bom código ...)

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")

Mas isso não vai ganhar um concurso de beleza.

Se você pudesse dar um pouco mais de informação sobre o que está tentando fazer, seria mais fácil dar conselhos úteis ... (porque nenhuma das soluções nesta página parece realmente fofa)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top