Attribute.GetCustomAttributes()没有获取我的自定义属性

时间:2016-01-26 22:09:04

标签: asp.net-mvc linq reflection custom-attributes

这是我的设置,我在解决方案上有三个项目: 项目A:MVC的类库 项目B:MVC网站(主要) 项目C:MVC网站(仅限地区)

C作为区域部署在B上,并且工作得非常好。 B引用A和C. C引用A。

在类库A中,我定义了以下属性(删除了错误检查):

 [AttributeUsage(AttributeTargets.Method)]
 public class MyAttribute : Attribute {
     public string Name = "";
     public MyAttribute(string s)
     {
         Name = s;
     }
 }

然后在项目C中(与项目B中相同)我有一些类,其中一些方法使用我的自定义属性进行修饰:

 public class SomeController : Controller, ISomethingSpecial
 {
      [MyAttribute("test")]
      public ActionResult Index() {
          return View();
      }
 }

自定义属性应用于操作方法,如属性使用约束所示。

为了测试,我把这段代码放在控制器的一个动作方法中:

IEnumerable<System.Type> all =
        System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<System.Reflection.Assembly>().SelectMany(a => a.GetTypes()).Where(type => typeof(ISomethingSpecial).IsAssignableFrom(type)).ToList();

foreach (Type t in all) {
    if (!t.Equals(typeof(ISomethingSpecial))) {
       MyAttribute[] sea = (MyAttribute[])Attribute.GetCustomAttributes(t, typeof(MyAttribute));
    }
}

当我调试代码时,我进入迭代,其中检查类型 t SomeController ,其中有一些方法用我的自定义属性修饰。但是我看到返回的GetCustomAttributes列表中有元素!

在有人询问我基本上想要实现的是获取实现 ISomethingSpecial 接口的Web应用程序的程序集列表之前,我想要从候选列表中提取方法的名称(使用我的自定义属性 MyAttribute

修饰的MVC操作方法

1 个答案:

答案 0 :(得分:0)

您在方法上定义的属性不在类上。但是在您的代码中,您需要从类中请求自定义属性。如果需要从方法中获取属性,则应使用

迭代每个方法
Type.GetMethods

https://msdn.microsoft.com/en-us/library/4d848zkb(v=vs.110).aspx

并为每个方法请求自定义属性,就像您现在为您的类一样。