C# 利用反射查看类的信息
2016-07-21 17:17
573 查看
using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Text; public class RefPrint { public static PrintLog PrintTool; private static StringBuilder sb = new StringBuilder(); public static void PrintClassInfo<T>(T obj) where T : class { if (obj == null) { PrintTool.WriteLine("print class of null"); return; } sb = new StringBuilder(); sb = sb.AppendLine(obj.GetType().Name); Type t = obj.GetType(); PrintFields(t, obj); PrintTool.WriteLine(sb.ToString()); } public static void PrintClassInfo(object obj) { if (obj == null) { PrintTool.WriteLine("print class of null"); return; } sb = new StringBuilder(); sb = sb.AppendLine(obj.GetType().Name); Type t = obj.GetType(); PrintFields(t, obj); PrintTool.WriteLine(sb.ToString()); } public static void PrintList(object listValue) { IEnumerable e = listValue as IEnumerable; FieldInfo[] fList = null; foreach (var c in e) { fList = c.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); foreach (var item in fList) { sb = sb.AppendLine(item.FieldType.Name + "\t" + item.Name + "\t" + item.GetValue(c).ToString()); } } } public static void PrintAry(object aryValue) { IEnumerable e = aryValue as IEnumerable; FieldInfo[] fList = null; foreach (var c in e) { if (c.GetType().Name.Contains("String")) { sb = sb.AppendLine(c.GetType().Name + "\t" + c); } else if (!c.GetType().Name.Contains("String") && c.GetType().IsClass) { fList = c.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); foreach (var item in fList) { sb = sb.AppendLine(item.FieldType.Name + "\t" + item.Name + "\t" + item.GetValue(c)); } } else { sb.AppendLine(c.GetType().Name + "\t" + c + "\t"); } } } public static void PrintMemebers(Type t, object value) { var mList = t.GetMembers(); foreach (var item in mList) { sb = sb.AppendLine("method: " + item.Name); } } public static void PrintFields(Type t, object value) { var fList = t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (var item in fList) { if (!item.FieldType.IsClass || (item.FieldType.Name == "String")) sb = sb.AppendLine(item.FieldType.Name + "\t" + item.Name + "\t" + item.GetValue(value)); if (item.FieldType.Name.Contains("List")) { sb = sb.AppendLine("集合" + item.Name + ":"); Object listValue = item.GetValue(value); PrintList(listValue); } if (item.FieldType.Name.Contains("[]")) { sb = sb.AppendLine("数组" + item.Name + ":"); Object aryValue = item.GetValue(value); PrintAry(aryValue); } } } public static void PrintProperties(Type t, object value) { var pList = t.GetProperties(); foreach (var item in pList) { sb = sb.AppendLine(item.Name + " " + item.GetValue(value, new object[] { })); } } } public interface PrintLog { void WriteLine(string text); }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Collections; namespace 反射查看类的信息 { class Program { static void Main(string[] args) { PlateFace f = new PlateFace(); f.Add(new PlateFaceSon()); RefPrint.PrintTool = new MyPrint(); RefPrint.PrintClassInfo<PlateFace>(f); Console.ReadLine(); } } public class MyPrint : PrintLog { public void WriteLine(string text) { Console.WriteLine(text); } } public class PlateFace { private int a = 1; private double b = 2; private string c = "c"; private int[] d = { 1, 2, 3, 4 }; private string[] e = { "A", "b", "c", "1" }; private List<PlateFaceSon> f = new List<PlateFaceSon>(); private Dictionary<int, PlateFaceSon> j = new Dictionary<int, PlateFaceSon>(); public void Test() { } public void Add(PlateFaceSon t) { f.Add(t); } } public class PlateFaceSon { public string Name = "盘子脸的儿子"; public int Age = 10; public override string ToString() { return "Name: " + Name + "Age: " + Age; } } }
相关文章推荐
- C#中DataTable的用法
- 文件基本操作之获取文件夹下的所有子文件夹及其名称
- C#调用存储过程的几个方法
- c#非独占延时
- C#动态库调用方法
- C# 快捷键
- c# 泛型 list 用法
- C#中,双屏/两屏/三屏/多屏跳转判断
- 每一个C#开发者必须知道的13件事情
- C# 类型"*.Properties.Resources" 没有名为"*"的属性,已经解决
- C#中的排序
- [c#笔记]Winform TextBox中只能输入数字的几种常用方法(C#)
- 文件基本操作之创建和删除文件
- c#中XML解析文件出错解决方法
- .net/c#常用框架/中间件简介(不定时更新)
- c#判断email地址是否为合法
- Socket接口原理及C#实现
- 【转】C#Winform程序如何发布并自动升级(图解)
- C#语言基础——进制
- C# 索引器