Доступ к атрибуту обернутого метода в C # - PullRequest
2 голосов
/ 17 марта 2010

У меня есть следующий код:

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

Для простоты использования у меня есть несколько похожих методов, использующих метод выше. Например:

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

Но когда я использую второй метод (описанный выше), даже если исходное действие имело атрибут, код [1] не будет выполнен.

Как узнать, является ли метод только оболочкой, а базовый метод содержит атрибут и как получить доступ к этому атрибуту?

Ответы [ 2 ]

3 голосов
/ 17 марта 2010

Хотя я уверен, что вы могли бы использовать деревья выражений, самым простым решением было бы просто создать перегрузку, которая принимает дополнительный параметр типа MethodInfo, и использовать его следующим образом:


public static void ProcessStep(Action<bool> action) 
{ 
    ProcessStep(() => action(true), action.Method); //this is only example, don't bother about hardcoded true 
}
0 голосов
/ 17 марта 2010

Ну, вы могли бы сделать ( Я не обязательно думаю, что это хороший код ... )

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

но это не победит в конкурсе красоты.

Если бы вы могли дать немного больше информации о том, что вы пытаетесь сделать, было бы легче дать полезный совет ... (потому что ни одно из решений на этой странице не выглядит очень мило)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...