查找在控件中具有属性的属性

时间:2011-06-17 16:32:16

标签: c# reflection attributes custom-attributes

我有一个包含许多控件的页面。

当页面呈现时,我想遍历页面上的所有控件并找到具有某个属性的属性的任何控件。我试图用c#做这个 - 有什么想法我可以实现这个吗?

4 个答案:

答案 0 :(得分:1)

您需要使用Reflection http://msdn.microsoft.com/en-us/library/system.reflection.aspx

使用反射可以获得对象的所有属性

答案 1 :(得分:1)

我不知道你的控制树有多大。这就是我要做的。我没有表现出最好的表现。

案例1。寻找.NET属性

IEnumerable<Control> GetMarkedControls(ControlCollection controls)
{
  foreach(Control c in controls)
  {
    var props = c.GetType().Properties();
    if(props.Count(x => x.GetCustomAttributes(false).OfType<YourAttribute>().Count() > 0) > 0)
      yield return c;

    foreach (Control ic in GetMarkedControls(c.Controls))
      yield return ic;
  }
}

案例2。寻找HTML属性

IEnumerable<WebControl> GetMarkedControls(ControlCollection controls)
{
  foreach(Control c in controls)
  {
    if(c is WebControl)
    {
      var wc = c as WebControl;
      if (wc.Attributes.FirstOrDeafult(x => x.Name == "yourAttribute") != null)
        yield return c;
    }

    foreach (Control ic in GetMarkedControls(c.Controls))
      yield return ic;
  }
}

现在您可以通过以下方式调用它:var controlsWAttribute = GetMarkedControls(this.Controls);来自您的页面或任何控件。这样您就不必在页面级别调用它。

使用此方法,您可以浏览页面中的整个控制树或递归控制。

答案 2 :(得分:0)

页面上的每个控件都有一个“controls”属性,其中包含所有子控件。我已经编写了递归函数来循环遍历这些函数,但是手头没有。让我试着快速写一个:

public Collection<Control> findControlsWithAttributes(Control startingControl)
{
    Collection<Control> toReturn = new Collection<Control>();
    foreach (Control curControl in startingControl.controls)
    {
        if (DO COMPARISON HERE WITH CURCONTROL) toReturn.add(curControl);
        if (curControl.Count() > 0) findControlsWithAttributes(curControl, toReturn);
    }
    return toReturn;
}

private void findControlsWithAttributes(Control startingControl, Collection<Control> inputCollection)
{
    foreach (Control curControl in startingControl.controls)
    {
        if (DO COMPARISON HERE WITH CURCONTROL) inputCollection.add(curControl);
        if (curControl.Count() > 0) findControlsWithAttributes(Control startingControl, Collection<Control> inputCollection);
    }
}

我已经这么做了一段时间,如果Collection.Count是一个方法或属性,我不记得我的头顶,所以请确保先检查,但如果你通过页面然后,这将检查页面上每个服务器可见的控件,并返回包含与您的比较匹配的控件的集合。

最后,Control.Attributes将返回一个您应该能够随后进行比较的AttributeCollection。

答案 3 :(得分:0)

不确定你追求的是什么属性,但是如果看到@ user751975之后你的类属性是你的,那么你可以做类似......

page.Controls.Cast<System.Web.UI.WebControls.WebControl>().First().Attributes["class"]