一个对象,内部可能包含很多字段,其字段如果是值类型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:如果字段是一个数组,如何取得这个数组的元素值请各位高人不吝赐教。

解决方案 »

  1.   

    你的问题根本就不是问题。如果是值类型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); 
                        } 
      

  2.   

    CsToD 学海无涯 兄的意思是我没有必要判断FieldType吗?那我如何做,能详细指教一下吗?
      

  3.   


    我没有说清楚?
    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)显示的是类型
    但实际上跟你这个问题一点关系没有