ماذا يكون اقصر الطرق لتأكيد أن يتم تطبيق السمة إلى الأسلوب في ج #؟

StackOverflow https://stackoverflow.com/questions/639913

سؤال

وماذا يكون اقصر الطرق لتأكيد أن يتم تطبيق السمة إلى الأسلوب في ج #؟

وأنا باستخدام nunit 2.5

:)

هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

ولست متأكدا من أسلوب تأكيد أن يستخدم nunit، ولكن يمكنك ببساطة استخدام هذا التعبير المنطقي عن المعلمة التي يتم تمريرها إليه (على افتراض انك قادرة على استخدام LINQ:

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

إذا تم تطبيق سمة، ثم فإنه سيعود صحيح.

إذا كنت تريد أن تجعل من إصدار عام (وليس استخدام تشير 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)));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top