Я хочу написать метод расширения, который проверяет, применяется ли атрибут к вызову метода, и я хотел бы указать метод как лямбда-выражение. В настоящее время у меня есть следующий (рабочий) подход, но мне действительно не нравится, как выглядит этот код:
// Signature of my extension method:
public static bool HasAttribute<TAttribute, TDelegate>(this Expression<TDelegate> method)
// Usage (current code)
Expression<Func<AccountController, LogInModel, string, ActionResult>> mut = (c, m, s) => c.LogIn(m, s);
mut.HasAttribute<ExportModelStateAttribute, Func<AccountController, LogInModel, string, ActionResult>>().ShouldBeTrue();
Как видите, мне нужно дважды указать тип делегата, и ни разу это не выглядит красиво ... Я бы хотел иметь что-то более похожее на
// Usage (if I had my way...)
var mut = (c, m, s) => c.LogIn(m, s);
mut.HasAttribute<ExportModelStateAttribute>().ShouldBeTrue();
но я понимаю, что, возможно, слишком много просил.
Можно ли как-то реорганизовать аргументы типа из моего текущего кода?
Причина, по которой у меня есть аргумент типа TDelegate
, заключается в том, что я хочу использовать его независимо от сигнатуры метода и типа возвращаемого значения, а также от количества входных аргументов и от того, является ли рассматриваемый метод void
или функция, TDelegate
должна меняться. Я не хочу иметь одну отдельную реализацию для каждого количества входных аргументов для метода, который я тестирую ...
Обновление:
Как отмечает Джей в комментарии, мне, очевидно, не нужно указывать аргумент типа TDelegate
в вызове HasAttribute<>
. Код теперь выглядит так:
Expression<Func<AccountController, LogInModel, string, ActionResult>> mut = (c, m, s) => c.LogIn(m, s);
mut.HasAttribute<ExportModelStateAttribute>().ShouldBeTrue();
Это намного лучше, но я все еще думаю, что первая строка довольно грязная. Может ли быть еще лучше?