如何反射取得一个对象中所有字段的值

white_dove3000 2008-07-28 09:46:08
一个对象,内部可能包含很多字段,其字段如果是值类型ValueType的,可以通过下面的方法取得它的值,如果是String型,也可以。
Type t = obj.GetType();
FieldInfo[] flds = t.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Static
| BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
);
foreach (FieldInfo fld in flds)
{
Type fldType = fld.FieldType;
if (fldType.IsValueType || fldType == typeof(String))
{
retBuiler.Append("\t" + fld.Name + " = " + fld.GetValue(obj));
retBuiler.Append(System.Environment.NewLine);
}
}

问题1:

但如果字段是一个对象(某个类的实例,对象嵌套的情况),如何判断这个字段是一个对象类型并反射取得这个字段对象内各个字段的值?

问题2:

如果字段是一个数组,如何取得这个数组的元素值

请各位高人不吝赐教。
...全文
851 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CsToD 2008-07-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 white_dove3000 的回复:]
CsToD 学海无涯 兄的意思是我没有必要判断FieldType吗?那我如何做,能详细指教一下吗?
[/Quote]

我没有说清楚?
class MyClass
{
int a;
string b;
Button c;
Bitmap d;
}
在FieldInfo实例上调用GetValue就得到这些字段的object值,你还想进一步获得字段的字段?
比如int有一个字段MaxValue,你就会获取这个字段,它的类型也是int,它也有MaxVaule字段。。。
所以如果你递归的话,根本没有终点,因为任何字段它本身也是某个类型,也包括字段

之所以你认为需要区分FieldType,我估计是因为:
你认为Console.Write(int)和Console.Write(string)显示的是字段本身
而Console.Write(Button)和Console.Write(Bitmap)显示的是类型
但实际上跟你这个问题一点关系没有

white_dove3000 2008-07-28
  • 打赏
  • 举报
回复
CsToD 学海无涯 兄的意思是我没有必要判断FieldType吗?那我如何做,能详细指教一下吗?
我姓区不姓区 2008-07-28
  • 打赏
  • 举报
回复
根据FieldType递归反射
wtl710 2008-07-28
  • 打赏
  • 举报
回复
路过顶下
CsToD 2008-07-28
  • 打赏
  • 举报
回复
你的问题根本就不是问题。

如果是值类型ValueType的,可以通过下面的方法取得它的值,如果是String型,也可以
但如果字段是一个对象(某个类的实例,对象嵌套的情况),如何判断这个字段是一个对象类型并反射取得这个字段对象内各个字段的值?


一切皆对象。
ValuType和String也是对象,也包括字段,所以根本不存在你所认为的两种情况
Type t = obj.GetType();
FieldInfo[] flds = t.GetFields(BindingFlags.DeclaredOnly ¦ BindingFlags.Static
¦ BindingFlags.Instance ¦ BindingFlags.Public ¦ BindingFlags.NonPublic;
);
foreach (FieldInfo fld in flds)
{
Type fldType = fld.FieldType;
if (fldType.IsValueType ¦ ¦ fldType == typeof(String))
{
retBuiler.Append("\t" + fld.Name + " = " + fld.GetValue(obj)); ===》看这里:fld.GetValue得到的是什么?也是一个对象吧?你要获得它的字段,你把之前的代码再写一次不就完了?
object o=fid.GetValue(obj);
Type ty=o.GetType();
FieldInfo[]fs=ty.GetFields(BindingFlags.....);
所以说你是知道方法的,只不过是糊涂了

retBuiler.Append(System.Environment.NewLine);
}
}
kbryant 2008-07-28
  • 打赏
  • 举报
回复
友情帮你定

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧