如何使用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
执行相同的操作,但是没有集中的地方可以隐藏逻辑,不像TypeDescriptor
和TypeDescriptionProvider
(不要担心这些是不熟悉的;您可以“按原样”使用代码; -p)。
使用:
上述就是C#学习教程:如何使用Reflection获取类及其基类(在层次结构中)的所有属性? (C#)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
TypeDescriptor.GetProperties(obj);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/983405.html