Asp.net mvc Asp.net Mvc:列出控制器上具有特定属性的所有操作

Asp.net mvc Asp.net Mvc:列出控制器上具有特定属性的所有操作,asp.net-mvc,sitemap,Asp.net Mvc,Sitemap,我正在尝试列出所有控制器及其具有特定属性的操作,以创建动态google站点地图。这样我就可以用一个属性“标记”某些动作,使它们显示在网站地图上 我找到了获取所有控制器的方法。但我不知道如何让他们的所有动作都具有特定的属性。我尝试了GetMethods,然后使用GetCustomAttributes,但我不确定这样做是否正确。感觉有点太复杂了 一旦我得到了控制器和它们的动作,我就要使用上面介绍的技术来获取URL。正如你可能注意到的,埃里克·邓肯谈到了我在这个问题上努力实现的目标 提前感谢。我在单元

我正在尝试列出所有控制器及其具有特定属性的操作,以创建动态google站点地图。这样我就可以用一个属性“标记”某些动作,使它们显示在网站地图上

我找到了获取所有控制器的方法。但我不知道如何让他们的所有动作都具有特定的属性。我尝试了GetMethods,然后使用GetCustomAttributes,但我不确定这样做是否正确。感觉有点太复杂了

一旦我得到了控制器和它们的动作,我就要使用上面介绍的技术来获取URL。正如你可能注意到的,埃里克·邓肯谈到了我在这个问题上努力实现的目标


提前感谢。

我在单元测试中使用一些代码来验证某些操作是否用属性修饰。它使用反射和一些可枚举的扩展方法。我想你可以适应这个。注意,如果您只关心它是否存在,那么可以对枚举使用Count(),而不是获取实际的属性。通过这种方式,您可以灵活地使用属性属性自定义行为。使用继承树可以装饰整个控制器

 var methods= controller.GetType()
                        .GetMethods( BindingFlags.Public | BindingFlags.Instance )
 foreach (var info in methods)
 {
     if (info.ReturnType  == typeof(ActionResult))
     {
        var attribute = info.GetCustomAttributes( typeof( SiteMapAttribute ), true )
                            .Cast<SiteMapAttribute>()
                            .FirstOrDefault();

        if (attribute != null && !attribute.Exclude.Contains( info.Name ))
        {
            ...
        }
    }
}
var-methods=controller.GetType()
.GetMethods(BindingFlags.Public | BindingFlags.Instance)
foreach(方法中的var信息)
{
if(info.ReturnType==typeof(ActionResult))
{
var attribute=info.GetCustomAttributes(typeof(SiteMapAttribute),true)
.Cast()
.FirstOrDefault();
if(attribute!=null&&!attribute.Exclude.Contains(info.Name))
{
...
}
}
}