如何迭代C#类查找特定类型的所有实例,然后在每个实例上调用方法

是否有可能(通过reflection?)迭代一个对象的所有字段,在每个字段上调用一个方法。

我有一个这样的课:

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控件。

谢谢你的帮助。

 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(); } } } } 

注意:这将过滤掉类中不是控件的字段。 此外,对于从Controlinheritance的任何字段类型, IsAssignableFrom将返回true,假设您也希望处理这些字段。

 var props = typeof(Overlay).GetProperties().OfType(); 
 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(); } 

请注意,如果对象也没有Control字段,则需要通过GetValue()添加对返回值类型的附加检查。