如何迭代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()
添加对返回值类型的附加检查。