9

阅读帖子“如何检查方法是否具有属性”后,我是解决让我保持清醒的问题的一步。

我介绍一下情况:

(我正在使用 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();
}

我的问题是:

类中的调用MethodHasAuthorizeAttribute(() => superHeroFlyable.Fly())在它应该返回时返回。SuperHeroTestfalsetrue

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

我将Authorize方法中的属性添加FlyIFlyable然后返回true

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

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

4

1 回答 1

9

通过对 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();
    }
}
于 2012-09-30T09:20:26.093 回答