Каков самый короткий способ подтвердить, что атрибут применяется к методу в С#?
-
11-07-2019 - |
Вопрос
Каков самый короткий способ подтвердить, что атрибут применяется к методу в С#?
Я использую nunit-2.5
:)
Решение
MethodInfo mi = typeof(MyType).GetMethod("methodname");
Assert.IsFalse (Attribute.IsDefined (mi, typeof(MyAttributeClass)));
Другие советы
Я не уверен в методе утверждения, который использует nunit, но вы можете просто использовать это логическое выражение для передаваемого ему параметра (при условии, что вы можете использовать LINQ:
methodInfo.GetCustomAttributes(attributeType, true).Any()
Если атрибут применен, он вернет true.
Если вы хотите создать общую версию (и не использовать typeof), вы можете использовать универсальный метод, чтобы сделать это за вас:
static bool IsAttributeAppliedToMethodInfo<T>(this MethodInfo methodInfo)
where T : Attribute
{
// If the attribute exists, then return true.
return methodInfo.GetCustomAttributes(typeof(T), true).Any();
}
А затем вызовите его в своем методе утверждения следующим образом:
<assert method>(methodInfo.IsAttributeAppliedToMethodInfo<MyAttribute>());
Чтобы сделать это с помощью выражения, вы можете сначала определить следующий метод расширения:
public static MethodInfo
AssertAttributeAppliedToMethod<TExpression, TAttribute>
(this Expression<T> expression) where TAttribute : Attribute
{
// Get the method info in the expression of T.
MethodInfo mi = (expression.Body as MethodCallExpression).Method;
Assert.That(mi, Has.Attribute(typeof(TAttribute)));
}
А затем вызовите его в таком коде:
(() => Console.WriteLine("Hello nurse")).
AssertAttributeAppliedToMethod<MyAttribute>();
Обратите внимание, что не имеет значения, какие параметры передаются методу, поскольку метод никогда не вызывается, ему просто нужно выражение.
Альтернатива для nunit 2.5:
var methodInfo = typeof(MyType).GetMethod("myMethod");
Assert.That(methodInfo, Has.Attribute(typeof(MyAttribute)));