阅读帖子“如何检查方法是否具有属性”后,我是解决让我保持清醒的问题的一步。
我介绍一下情况:
(我正在使用 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())
在它应该返回时返回。SuperHeroTest
false
true
Fly
(类中实现的方法SuperManController
具有属性Authorize
)。
我将Authorize
方法中的属性添加Fly
到IFlyable
然后返回true
。
public interface IFlyable
{
[Authorize]
ActionResult Fly();
}
我该如何MethodHasAuthorizeAttribute
检查实现而不是接口?