9

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

在这里,我了解了如何获取所有控制器。但我不确定如何获得具有特定属性的所有操作。我尝试了 GetMethods,然后使用 GetCustomAttributes,但我不确定这是否是正确的方法。感觉有点过于复杂了。

一旦我得到控制器和他们的动作,我将使用这里解释的技术来获取 url。正如您可能注意到的那样,Eric Duncan 谈到了我在那个问题中想要完成的事情。

提前致谢。

4

1 回答 1

18

我在单元测试中使用了一些代码来验证某些操作是否用属性修饰。它使用具有一些可枚举扩展方法优点的反射。我想你可以适应这个。请注意,如果您只关心它是否存在,您可以在枚举上使用 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 ))
        {
            ...
        }
    }
}
于 2009-08-31T16:26:16.397 回答