如何使用Reflection获取类及其基类(在层次结构中)的所有属性? (C#)

所以我现在所拥有的是这样的:

PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public); 

其中obj是某个对象。

问题是我想要的一些属性不在obj.GetType()它们位于其中一个基类中。 如果我停止调试器并查看obj,我必须挖掘一些“基础”条目以查看我想要获得的属性。 是否有一些绑定标志我可以设置它返回那些或我是否必须递归挖掘Type.BaseType层次结构并对所有这些进行GetProperties

用这个:

 PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

编辑:当然,正确答案是杰伊 。 不带参数的GetProperties()等效于GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static )BindingFlags.FlattenHierarchy在这里BindingFlags.FlattenHierarchy

我认为这并不复杂。

如果您将BindingFlags参数移除到GetProperties,我想您会得到您正在寻找的结果:

  class B { public int MyProperty { get; set; } } class C : B { public string MyProperty2 { get; set; } } static void Main(string[] args) { PropertyInfo[] info = new C().GetType().GetProperties(); foreach (var pi in info) { Console.WriteLine(pi.Name); } } 

产生

     MyProperty2
    我的财产

如果访问Type.BaseType ,则可以获取基本类型。 您可以递归访问每个基类型,当您的类型为System.Object时,您将知道何时触及底部。

 Type type = obj.GetType(); PropertyInfo[] info = type.GetProperties(BindingFlags.Public); PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public); 

我倾向于同意尼古拉斯; 除非您知道需要reflection,否则ComponentModel是一个可行的替代方案,其优点是即使对于运行时模型(例如DataView / DataRowView ),您也将获得正确的元数据。

例如:

  foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) { Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj)); } 

顺便说一句,你也可以做一些简单的表演技巧 ; 您可以使用reflection和Delegate.CreateDelegate执行相同的操作,但是没有集中的地方可以隐藏逻辑,不像TypeDescriptorTypeDescriptionProvider (不要担心这些是不熟悉的;您可以“按原样”使用代码; -p)。

使用:

 TypeDescriptor.GetProperties(obj);