在VS2012中新建一个控制台应用措施(我的定名是ReflectionStudy),这个项目是基于.net 4.0。接着我们打开Program.cs文件,凭据如下在Program中写一个我们本身的类:
1 public class RefClass 2 { 3 private int _test3; 4 private int _test1 { get; set; } 5 protected int Test2 { get; set; } 6 public int Test3 { get; set; } 7 8 public void Show() 9 { 10 11 } 12 }
窥视内部
常言道知彼知己百战不殆,所以我们第一步也是关键的一步就是要窥视RefClass类的布局(这里我们假设对RefClass并不理解)。
首先我们先要纵览全局才华继续深入,所以我们先在Main中写入如下代码:
1 static void Main(string[] args) 2 { 3 Type t = typeof(RefClass); 4 MemberInfo[] minfos = t.GetMembers(); 5 foreach (MemberInfo minfo in minfos) 6 { 7 Console.WriteLine(minfo.Name); 8 } 9 Console.ReadKey(); 10 }
在这里我们获取这个类的类型,然后获取了此中的大众成员(可能很多人城市认为GetMembers是获取全部,但其实只是获取果然的所有成员。)然后我们通过foreach将所有的成员的名称循环输出。
然后我们可以检察控制台的输出:
在这里我们可以看到此中不只仅输出了我们所写类中的成员,同时还输出了父类的成员(如果不理解的这里帮你们增补下根本,Object是所有类的基类。),细心的读者必然会发明这里的输出并没有包罗private和protected访谒权限的成员。这就应了上面的那句话:GetMembers默认返回果然的成员。
仅仅只能看到这些果然的成员对我们来说意义并不大,所以我们需要检察到那些非公有的成员。
下面我们将上面的代码改成如下所示:
1 static void Main(string[] args) 2 { 3 Type t = typeof(RefClass); 4 MemberInfo[] minfos = t.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public ); 5 foreach (MemberInfo minfo in minfos) 6 { 7 Console.WriteLine(minfo.Name); 8 } 9 Console.ReadKey(); 10 }
从中我们看到我们使用了GetMembers的重载版本,并且传入了枚举类型,分袂是“包罗非果然”、“包罗实例成员”和“包罗果然”。然后我们就可以获取到所有成员了。
最终我们将会得出下面这些成员:
到这里你可能会认为我们已经检索结束了,但是你有没有发明属性很多,而且还包罗了大量的父类中的属性,假设我们只存眷该类中的成员,并不存眷父类中的成员该如何做呢?
其实我们只需要加上一个枚举类型(BindingFlags.DeclaredOnly):
1 MemberInfo[] minfos = t.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly );
然后我们再检察功效:
此时就只包罗该类中的成员了。
下面我们在RefClass类中添加两个静态要领,如下所示: