首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c#中断言属性已应用于方法的最短方法是什么?

在c#中断言属性已应用于方法的最短方法是什么?
EN

Stack Overflow用户
提问于 2009-03-12 18:33:02
回答 3查看 313关注 0票数 0

在c#中断言属性已应用于方法的最短方法是什么?

我使用的是nunit-2.5

:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-12 18:44:52

代码语言:javascript
复制
MethodInfo mi = typeof(MyType).GetMethod("methodname");    

Assert.IsFalse (Attribute.IsDefined (mi, typeof(MyAttributeClass)));
票数 3
EN

Stack Overflow用户

发布于 2009-03-12 18:38:01

我不确定nunit使用的assert方法,但您可以简单地对传递给它的参数使用这个布尔表达式(假设您能够使用LINQ:

代码语言:javascript
复制
methodInfo.GetCustomAttributes(attributeType, true).Any()

如果应用了该属性,则它将返回true。

如果你想创建一个泛型版本(而不是使用typeof),你可以使用一个泛型方法来实现:

代码语言:javascript
复制
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方法中调用它,如下所示:

代码语言:javascript
复制
<assert method>(methodInfo.IsAttributeAppliedToMethodInfo<MyAttribute>());

要使用表达式执行此操作,可以先定义以下扩展方法:

代码语言:javascript
复制
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)));
}

然后像这样在代码中调用它:

代码语言:javascript
复制
(() => Console.WriteLine("Hello nurse")).
    AssertAttributeAppliedToMethod<MyAttribute>();

请注意,传递给该方法的参数是什么并不重要,因为该方法从未调用过,它只需要表达式。

票数 1
EN

Stack Overflow用户

发布于 2009-03-12 18:56:13

nunit 2.5的替代方案:

代码语言:javascript
复制
var methodInfo = typeof(MyType).GetMethod("myMethod");

Assert.That(methodInfo, Has.Attribute(typeof(MyAttribute)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/639913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档