Вопрос

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

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] не будет выполнен.

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

Это было полезно?

Решение

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


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

Другие советы

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

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

но это не поможет тебе выиграть конкурс красоты.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top