Después de leer el mensaje "How to check if method has an attribute" Estoy a un paso para resolver un problema que me mantiene despierto.Cómo comprobar si el método tiene un atributo (con interfaces, fundición y resumen)
presento la situación:
(Estoy trabajando con ASP.Net MVC 4)
Estas interfaces:
public interface IFlyable
{
ActionResult Fly();
}
public interface IRunnable
{
ActionResult Run();
}
Esta clase abstracta:
public abstract class SuperHero : Controller
{
public void SavePeople()
{
}
}
Este controlador:
public class SuperManController : SuperHero,IFlyable,IRunnable {
[Authorize]
public ActionResult Fly(){
// Flying...
}
[Authorize]
public ActionResult Run(){
// Running...
}
}
Esta clase abstracta (para pruebas)
[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);
}
}
}
Y finalmente esta clase heredada de SuperHeroTest
para probar SuperManController
:
[TestClass]
public class SuperManControllerTest : SuperHeroTest<SuperManController>{
private SuperManController _superManController;
public SuperManControllerTest(){
_superManController=new SuperManController();
}
protected override SuperManController GetSuperHero()
{
return _superManController;
}
}
Método MethodHasAuthorizeAttribute
es: (desde el post anterior)
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();
}
Mi problema es:
La llamada MethodHasAuthorizeAttribute(() => superHeroFlyable.Fly())
en SuperHeroTest
y vuelta en clase false
cuando debería devolver true
.
(El método implementado Fly
en la clase SuperManController
tiene el atributo Authorize
).
He añadido el atributo Authorize
en el método Fly
en IFlyable
y luego devuelve true
.
public interface IFlyable
{
[Authorize]
ActionResult Fly();
}
¿Cómo puedo hacer para que inspeccione el MethodHasAuthorizeAttribute
aplicación en lugar de la interfaz?
Gracias Dove para la edición! –