Как перебирать класс C #, искать все экземпляры определенного типа, затем вызывать метод для каждого экземпляра - PullRequest
4 голосов
/ 27 мая 2011

Возможно ли (через отражение?) Перебрать все поля объекта, вызывая метод для каждого из них.

У меня есть такой класс:

public class Overlay
{
    public Control control1;
    public Control control2;
}

Я бы хотел метод, который выглядит примерно так:

public void DrawAll()
{
    Controls[] controls = "All instances of Control"
    foreach (Control control in Controls)
    {
        control.Draw()
    }    
}     

Можно ли это сделать? Мне удалось получить все метаданные класса Control, но это относится только к типу, а не к конкретному экземпляру.

Я знаю, это кажется странным, но у меня есть свои причины. Я использую Unity 3D, и каждый элемент управления на самом деле является элементом управления GUI, созданным редактором.

Спасибо за любую помощь.

Ответы [ 3 ]

3 голосов
/ 27 мая 2011
public class Program
{
    static void Main(string[] args)
    {
        Overlay overlay = new Overlay();
        foreach (FieldInfo field in overlay.GetType().GetFields())
        {
            if(typeof(Control).IsAssignableFrom(field.FieldType))
            {
                Control c = field.GetValue(overlay) as Control;
                if(c != null)
                    c.Draw();
            }
        }
    }
}

Примечание: это отфильтрует поля в классе, которые не являются элементами управления.Кроме того, IsAssignableFrom вернет true для всех типов полей, которые наследуются от Control, при условии, что вы также хотите обрабатывать эти поля.

2 голосов
/ 27 мая 2011
var props = typeof(Overlay).GetProperties().OfType<Control>();
1 голос
/ 27 мая 2011
Overlay obj = new Overlay();
Type t = typeof(Overlay);
FieldInfo[] fields = t.GetFields();
foreach (FieldInfo info in fields)
{
    Control c = (Control)info.GetValue(obj);
    c.Draw();
}

Обратите внимание, что вам нужно добавить дополнительную проверку типа возвращаемого значения на GetValue(), если у вашего объекта также нет полей Control.

...