Frage

Was ist der kürzeste Weg zu behaupten, dass ein Attribut Methode in c # angewandt wird?

Ich bin mit nunit-2.5

:)

War es hilfreich?

Lösung

MethodInfo mi = typeof(MyType).GetMethod("methodname");    

Assert.IsFalse (Attribute.IsDefined (mi, typeof(MyAttributeClass)));

Andere Tipps

Ich bin mir nicht sicher, ob die Assertion-Methode, die nunit verwendet, aber Sie können einfach diesen Booleschen Ausdruck für den Parameter verwenden, die an sie übergeben wird (vorausgesetzt, Sie können LINQ verwenden:

methodInfo.GetCustomAttributes(attributeType, true).Any()

Wenn das Attribut angewandt wird, dann wird es wahr zurück.

Wenn Sie möchten, eine generische Version machen (und nicht verwenden typeof) können Sie eine generische Methode verwenden können, dies zu tun für Sie:

static bool IsAttributeAppliedToMethodInfo<T>(this MethodInfo methodInfo) 
    where T : Attribute
{
    // If the attribute exists, then return true.
   return methodInfo.GetCustomAttributes(typeof(T), true).Any();
}

Und dann rufen Sie es in Ihrer Assertion-Methode wie folgt:

<assert method>(methodInfo.IsAttributeAppliedToMethodInfo<MyAttribute>());

Um dies zu tun, mit einem Ausdruck, können Sie die folgende Erweiterung Methode definieren zuerst:

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)));
}

Und dann rufen Sie in Code wie folgt:

(() => Console.WriteLine("Hello nurse")).
    AssertAttributeAppliedToMethod<MyAttribute>();

Beachten Sie, dass es keine Rolle, was die Parameter, die an die Methode übergeben werden, sind, wie die Methode nie aufgerufen wird, muss es einfach den Ausdruck.

Eine Alternative für nunit 2.5:

var methodInfo = typeof(MyType).GetMethod("myMethod");

Assert.That(methodInfo, Has.Attribute(typeof(MyAttribute)));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top