2010-03-17 2 views
2

я следующий код:Доступ атрибут завернутые метод C#

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

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

ответ

3

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


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

Это не другая ситуация когда я не думал о совершенно очевидном решении :) Спасибо :) К сожалению, у меня есть более похожие методы, такие как ProcessStep, ProcessStep , ProcessStep + TParams, а код выглядит уродливым сейчас, поэтому я найду решение без этого атрибута. – prostynick

0

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

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

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

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

Смежные вопросы