字段信息与FieldInfo类型
emberInfo是一个基类,它包含的是类型的各种成员共有的一组信息。对于字段、属性、方法、事件等具体成员类型来说,它们包含的信息显然是不一样的,因此,在.NET中提供了FieldInfo类型来封装字段的信息,它继承自MemberInfo。
如果希望获取一个类型的所有字段,可以使用GetFields()方法,定义方法FieldExplore():
public static void FieldExplore(Type t)
{
StringBuilder sb = new StringBuilder();
FieldInfo[] fields = t.GetFields();
sb.AppendLine("Explore type " + t.Name + " fields:");
sb.AppendLine(String.Empty.PadLeft(50, '-'));
foreach (FieldInfo fi in fields)
{
sb.AppendLine("name:" + fi.Name);
sb.AppendLine("type:" + fi.FieldType);
sb.AppendLine("attributes:" + fi.Attributes);
sb.AppendLine();
}
Console.WriteLine(sb.ToString());
}
运行代码:
Type t = typeof(DemoClass);
FieldExplore(t);
运行结果:
值得一提的是Attributes属性,它返回一个System.Reflection.FieldAttributes位标记,这个位标记包含了字段的可访问性、是否静态等信息。查看一下前面定义的DemoClass类,可以看到,对于title字段,它的属性是public,InitOnly;对于const类型的text字段,它的属性为Public,Static,Literal,HasDefault,由此也可以看出,当声明一个const类型的变量,其同时也是静态static的。除此以外,由于给赋予了默认值,因此位标记中也包括了HasDefault。
针对于FieldType位标记,FieldInfo类提供了一组返回为bool类型的属性来说明字段的状态信息,常用的有:IsPublic,IsStatic,IsInitOnly,IsLiteral,IsPrivate等。
想要获取私有字段信息,依然可以使用重载了的GetFields方法,传入BindingFlags参数来进行过滤。
属性信息与PropertyInfo类型
和字段类似,System.Reflection.PropertyInfo封装了类型的属性信息,可以通过GetProperties()方法获取类型的所有属性信息。定义PropertyExplore()方法:
public static void PropertyExplore(Type t)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("Explore type " + t.Name + " property:");
sb.AppendLine(String.Empty.PadLeft(50, '-') );
PropertyInfo[] properties = t.GetProperties();
foreach (PropertyInfo pi in properties)
{
sb.AppendLine("name:" + pi.Name );
sb.AppendLine("type:" + pi.PropertyType );
sb.AppendLine("CanRead:" + pi.CanRead);
sb.AppendLine("CanWrite:" + pi.CanWrite);
sb.AppendLine("attributes:" + pi.Attributes);
}
Console.WriteLine(sb.ToString());
}
运行代码:
Type t = typeof(DemoClass);
PropertyExplore(t);
运行结果:
本文回顾:
字段信息与FieldInfo类型
属性信息与PropertyInfo类型