【问题标题】:How to check if method has an attribute (with interfaces, casting and abstract)如何检查方法是否具有属性(带有接口、强制转换和抽象)
【发布时间】:2012-09-21 10:57:28
【问题描述】:

阅读帖子“How to check if method has an attribute”后,我一步一步解决了让我保持清醒的问题。

我现在的情况:

(我正在使用 ASP.Net MVC 4)

这些接口

public interface IFlyable
{
    ActionResult Fly();
}    

public interface IRunnable
{
    ActionResult Run();
}

这个抽象类

public abstract class SuperHero : Controller
{
    public void SavePeople()
    {
    }    
}

这个控制器:

public class SuperManController : SuperHero,IFlyable,IRunnable {

    [Authorize]
    public ActionResult Fly(){
        // Flying...
    }    

    [Authorize]
    public ActionResult Run(){
        // Running...
    }    

}

这个抽象类(用于测试)

[TestClass]
public abstract class SuperHeroTest<TSuperHero>{

    protected abstract TSuperHero GetSuperHero();

    [TestMethod]
    public void IfSuperHeroCanFlyMustHaveAuthorizeAttribute(){

        var superHero=GetSuperHero();

        if(superHero is IFlyable)
        {
            var superHeroFlyable = (IFlyable) superHero;

            var have = MethodHasAuthorizeAttribute(() => superHeroFlyable.Fly());

            Assert.IsTrue(have);
        }

    }
}

最后这个类继承自SuperHeroTest来测试SuperManController

[TestClass]
public class SuperManControllerTest : SuperHeroTest<SuperManController>{

    private SuperManController _superManController;

    public SuperManControllerTest(){
        _superManController=new SuperManController();
    } 


    protected override SuperManController GetSuperHero()
    {
        return _superManController;
    }

}

方法MethodHasAuthorizeAttribute是:(来自上面的帖子)

public static MethodInfo MethodOf(Expression<System.Action> expression)
{
    MethodCallExpression body = (MethodCallExpression)expression.Body;
    return body.Method;
}

public static bool MethodHasAuthorizeAttribute( Expression<System.Action> expression )
{
    var method = MethodOf( expression );

    const bool includeInherited = false;
    return method.GetCustomAttributes(typeof(AuthorizeAttribute),includeInherited).Any();
}

我的问题是:

SuperHeroTest 类中的调用 MethodHasAuthorizeAttribute(() =&gt; superHeroFlyable.Fly()) 在应该返回 true 时返回 false

(类SuperManController中实现的方法Fly具有Authorize属性)。

我将方法Fly中的属性Authorize添加到IFlyable中,然后返回true

public interface IFlyable
{
    [Authorize]
    ActionResult Fly();
}  

如何让MethodHasAuthorizeAttribute 检查实现而不是接口?

【问题讨论】:

  • 感谢 Dove 的编辑!

标签: c# asp.net-mvc unit-testing reflection custom-attributes


【解决方案1】:

通过对 IfSuperHeroCanFlyMustHaveAuthorizeAttribute() 方法的一些修改,您可以让它工作。

首先检查你的控制器是否实现了 IFlyable 接口。如果是这样,获取控制器的 Fly 方法的 MethodInfo。那么您只需要检查返回的 MethodInfo 的属性。这样您就可以检查实现是否具有属性而不是接口。

以下工作正常:

[TestClass]
public abstract class SuperHeroTest<TSuperHero>
{
    protected abstract TSuperHero GetSuperHero();

    [TestMethod]
    public void IfSuperHeroCanFlyMustHaveAuthorizeAttribute()
    {
        var superHero = GetSuperHero();

        if (superHero is IFlyable)
        {
            var superHeroFlyable = superHero;
            var method = typeof (TSuperHero).GetMethod("Fly");
            var hasAttribute = 
                method.GetCustomAttributes(typeof (AuthorizeAttribute), false).Any();
            Assert.IsTrue(hasAttribute);
        }
    }

    public static MethodInfo MethodOf(Expression<System.Action> expression)
    {
        var body = (MethodCallExpression)expression.Body;
        return body.Method;
    }

    public static bool MethodHasAuthorizeAttribute(Expression<System.Action> expression)
    {
        var method = MethodOf(expression);
        const bool includeInherited = false;
        return method.GetCustomAttributes(
            typeof(AuthorizeAttribute), includeInherited).Any();
    }
}

【讨论】:

  • 如果 superHero 不是 IFlyable 则测试通过,断言应该在 if 块之外
猜你喜欢
  • 2019-09-30
  • 1970-01-01
  • 2011-07-04
  • 2020-11-24
  • 1970-01-01
  • 2011-10-25
  • 2017-01-09
  • 2011-06-03
相关资源
最近更新 更多