step one:(找入口)
using System.Reflection; //引用需要用到的命名空间
做任何事都要有开始的地方,不例外,反射也要先找到反射的入口,举个栗子: Assembly assemble = Assembly.Load("SqlServer"); //反射的入口::动态的加载dll
step two:(获类型)
加载完DLL之后,根据类的完整名称找到类型,再举个栗子: Type type = assemble.GetType("SqlServer.Class1"); //SqlServer.Class1就是SqlServer中的一个类
知道类之后可以通过循环遍历找到类中所有的方法名:
Console.WriteLine("*************GetMethods**************"); foreach (MethodInfo method in type.GetMethods()) { Console.WriteLine("名称{0}",method.Name); }
step three:(搞对象)
下面就要根据step two中获取的类型创对象,有了对象一切就都好办了,举例:object oBject = Activator.CreateInstance(type); //根据类型,创建对象,由于不知道对象类型所以只能object
再下来就是使用对象了,围绕着对象做一些事情
具体的使用方法举栗:
MethodInfo show1 = type.GetMethod("show1",new Type[] { }); //show1是类中的方法且是无参的 show1.Invoke(oBject,null); MethodInfo show2 = type.GetMethod("show2", new Type[] { typeof(int) }); //show2方法是有参数的 show2.Invoke(oBject, new object[] { 22});
要放大招了,准备好!````````````````````````````````````````````````````````````````````简直黑科技
你知道吗,通过反射可以调用类的私有方法,只能说也是贼溜了。
MethodInfo show3 = type.GetMethod("show3", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);//通过反射调用私有方法 show3.Invoke(oBject, null);
附上SqlServer.Class1的代码:
class="_mce_tagged_br">
1 public void show1() 2 { 3 4 Console.WriteLine("方法是{0}",this.GetType()); 5 6 } 7 8 public void show2(int id) 9 10 { 11 12 Console.WriteLine("这是show2方法(有参的){0}",id); 13 14 } 15 16 private void show3() 17 { 18 Console.WriteLine("这是私有方法{0}",this.GetType()); 19 }
同理 运用反射操作表结构----------------------------------------------------------
1.命名空间下的元素的默认访问修饰符
public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员。
internal : 同一程序集中的任何代码都可以访问该类型或成员,但其他程序集不可以访问。
2.各类型中的成员的默认访问修饰符
剩下的修饰符主要是正对继承这个语言特性的,拥有继承的类型有两个类(class)和接口(interface)。public,internal同样可以用于类型成员。
private : 同一类和结构的代码可以访问该类型和成员。
protected : 同一类和派生(继承特性)类中的代码可以访问该类型和成员。
protected internal : 同一程序集中的任何代码或其他程序集中的任何派生类都可以访问该类型或成员。
MSDN提示 :
1.) 派生类的可访问性不能高于其基类型。换句话说,不能有从内部类 A 派生的公共类 B。如果允许这种情况,将会使 A 成为公共类,因为 A 的所有受保护的成员或内部成员都可以从派生类访问。
2.) 成员的可访问性决不能高于其包含类型的可访问性。
3.) 可以使用五种访问类型中的任何一种来声明类成员(包括嵌套的类和结构)。
接口(interface)
接口成员访问修饰符默认为public,且不能显示使用访问修饰符。
类(class)
构造函数默认为public访问修饰符。
析构函数不能显示使用访问修饰符且默认为private访问修饰符。
类的成员默认访问修饰符为private;
枚举(enum)
枚举类型成员默认为public访问修饰符,且不能显示使用修饰符。
结构(struct)
结构成员默认为private修饰符。
结构成员无法声明为protected成员,因为结构不支持继承。
嵌套类型
嵌套类型的默认访问修饰符为private。 和类,结构的成员默认访问类型一致。