Доступ к атрибуту обернутого метода в C#
-
20-09-2019 - |
Вопрос
У меня есть следующий код:
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")
но это не поможет тебе выиграть конкурс красоты.
Если бы вы могли дать немного больше информации о том, что вы пытаетесь сделать, было бы легче дать полезный совет...(потому что ни одно из решений на этой странице не выглядит очень мило)