ポスト "How to check if method has an attribute"を読んだ後、私は目を覚ます問題を解決するための一歩です。メソッドに属性(キャストと要約を含む)があるかどうかを確認する方法
public interface IFlyable
{
ActionResult Fly();
}
public interface IRunnable
{
ActionResult Run();
}
この抽象クラス:
これらのインタフェース(私はASP.Net MVC 4で働いている):
私は状況を提示しますpublic abstract class SuperHero : Controller
{
public void SavePeople()
{
}
}
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);
}
}
}
そしてSuperManController
をテストするためにSuperHeroTest
から継承された最終的にはこのクラス:
[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
を返すべきとき。
(SuperManController
の実装方法Fly
には、属性Authorize
があります)。
Fly
のメソッドのAuthorize
をIFlyable
に追加した後、true
を返します。
public interface IFlyable
{
[Authorize]
ActionResult Fly();
}
私はMethodHasAuthorizeAttribute
が実装ではなく、インタフェースを検査するために行うことができますどのように?
ありがとう鳩編集のために! –