首页 新闻 会员 周边

有没有针对一个复杂类的快速自动ToString()方法?

0
悬赏园豆:30 [已解决问题] 解决于 2015-06-27 09:14
想实现对一个类中字段数据的描述,我从网上查阅了资料,自己实现了一个方法,能够对一个类直接实现描述。
        class xxx
        {
            public int ma = 20;
            private int mb = 100;
            private string sa = "abc";
            private string sb = "33333";
            private string sc = "ewr";
        }
 
        // 通过反射的形式获得一个对象的所有字段名字和值的描述集合
        public static string MSreflection<T>(T type, int ISeveryHH)
        {
            Type ty = type.GetType();
            FieldInfo[] fiel = ty.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
 
            string sall = "";
            string HH = ISeveryHH == 1 ? Environment.NewLine : "";
            foreach (FieldInfo fil in fiel)
            {
                object onow = fil.GetValue(type);
                string sone = onow != null ? onow.ToString() : "NULL";
                sall += "[" + fil.Name + "=" + sone + "] " + HH;
            }
            return sall;
        }

 

 
然后我调用这个方法
 xxx mx = new xxx();
MSreflection<xxx>(mx, 1);
 
得到了结果
[ma=20]
[mb=100]
[sa=abc]
[sb=33333]
[sc=ewr]
 
感觉很方便,但是如果类中包含了更复杂的数据字段呢,比如
        class test
        {
            Dictionary<int, int> dary = new Dictionary<int, int>();
            List<List<int>> sary = new List<List<int>>();
            List<int> nary = new List<int>();
            xxx mx = new xxx();
            wori wr = new wori();
            Tuple<Type, List<int>, string, int, long> tup = new Tuple<Type, List<int>, string, int, long>(typeof(int),null, null, 0, 1);
        }
 

 

 
然后我调用这个方法
            test ttt = new test();
            MSreflection<test>(ttt, 1);

 

得到结果是:
[dary=System.Collections.Generic.Dictionary`2[System.Int32,System.Int32]]
[sary=System.Collections.Generic.List`1[System.Collections.Generic.List`1[System.Int32]]]
[nary=System.Collections.Generic.List`1[System.Int32]]
[mx=yuzhouJuxiao.ZZtest+xxx]
[wr=yuzhouJuxiao.ZZtest+wori]
[tup=(System.Int32, , , 0, 1)]
 
这不是我想要的结果,我希望描述的方法能够自动识别其是否是List、Dictionary,Tuple并且对它们的每一个值进行描述,具体该怎么做呢? NET组件里面是否自带了相应的描述方法呢?.NET通过序列或反序列可以将一个对象直接保存,那么肯定是具有这种能力的。但是我们如何能够运用实现描述呢?还望各位大哥大姐指点下啊!
飞翔蚂蚁的主页 飞翔蚂蚁 | 初学一级 | 园豆:115
提问于:2015-06-21 09:59
< >
分享
最佳答案
0

http://omegacoder.com/?p=1063

 

在这基础上修改

收获园豆:30
Yu | 专家六级 |园豆:12980 | 2015-06-21 16:11

谢谢,我测试后,发现原文提供的方法有很多局限性,而且没有数据的话还报错,想要使用可能还要做很多细致的工作,我也测试了序列化为json和XML后,发现首先需要引用一个空间,然后后面的操作很繁琐,也有很多不足的地方,包括XML不能序列化私有字段,不支持DIctionary的直接序列化(要报错),序列化后的数据可视性很不友好。 

对于简单的类,MSreflection<T>()实现了只需要一句话就实现了描述。但是我还想找到一个能观察更多对象的方法和类。

我觉得显示一个对象的所有数据本意是观察,不干扰业务逻辑,同时也不想为了观察还特意去做较多的匹配工作,有没有比较方便的方法或者类能够使得我们在需要观察数据时,不需要额外去做一些工作,只调用一个方法即可显示所有的数据呢?如果没有,要自己去做,应该从哪些方面考虑思路呢?

飞翔蚂蚁 | 园豆:115 (初学一级) | 2015-06-21 19:10

@飞翔蚂蚁:

局限是肯定的,这需要自己扩展;

报错可以控制的;

对象序列化为json,可以使用 Json.net 第三方组件,开源的,你可以参考;

额外工作是要做的,没这么免费的午餐;

Yu | 园豆:12980 (专家六级) | 2015-06-21 20:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册