Nach dem Lesen der Post "How to check if method has an attribute" bin ich ein Schritt, um ein Problem zu lösen, das mich wach hält.Wie überprüft man, ob Methode ein Attribut hat (mit Schnittstellen, Casting und Abstract)
stelle ich die Situation:
(Ich arbeite mit ASP.Net MVC 4)
Diese Schnittstellen:
public interface IFlyable
{
ActionResult Fly();
}
public interface IRunnable
{
ActionResult Run();
}
Diese abstrakte Klasse:
public abstract class SuperHero : Controller
{
public void SavePeople()
{
}
}
Dieser Controller:
public class SuperManController : SuperHero,IFlyable,IRunnable {
[Authorize]
public ActionResult Fly(){
// Flying...
}
[Authorize]
public ActionResult Run(){
// Running...
}
}
Diese abstrakte Klasse (für Tests)
[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);
}
}
}
Und schließlich diese Klasse von SuperHeroTest
geerbt testen SuperManController
:
[TestClass]
public class SuperManControllerTest : SuperHeroTest<SuperManController>{
private SuperManController _superManController;
public SuperManControllerTest(){
_superManController=new SuperManController();
}
protected override SuperManController GetSuperHero()
{
return _superManController;
}
}
Methode MethodHasAuthorizeAttribute
ist: (aus dem Beitrag oben)
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();
}
Mein Problem ist:
Der Aufruf MethodHasAuthorizeAttribute(() => superHeroFlyable.Fly())
in SuperHeroTest
Klasse Rückkehr false
wenn es true
zurückkehren.
(Die implementierte Methode Fly
in Klasse SuperManController
hat das Attribut Authorize
).
Ich fügte das Attribut Authorize
in Methode Fly
in IFlyable
hinzu und gibt dann true
zurück.
public interface IFlyable
{
[Authorize]
ActionResult Fly();
}
Wie ich tun kann, um MethodHasAuthorizeAttribute
die Umsetzung zu machen kontrollieren, anstatt die Schnittstelle?
Dank Dove zur Bearbeitung! –