Acessando o atributo de método embrulhado em C#
-
20-09-2019 - |
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?
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)