随笔-9  评论-168  文章-266  trackbacks-0
//*********创建实例***********
Type t = typeof(ClassTest);//表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数...。
object obj = Activator.CreateInstance(t);//通过反射创建对象实例,如果是静态类则不须实例化
//obj = ass.CreateInstance("ReflectionTest.ClassTest"); //类的全限定名.命名空间.类名
//*********创建和调用方法***********
MethodInfo method = t.GetMethod("WriteString"); //搜索具有指定名称的公共方法。
String s = (String)method.Invoke(obj, new Object[] { "123" });//反射类的对象实例,方法参数 
//静态方法         
method = type.GetMethod("StaticWriteString");
method.Invoke(nullnew string[] { "test" }); //如果是静态方法,第1个参数则忽略,设为null  
 
//无参的静态方法
method = type.GetMethod("NoneParaWriteString");  
method.Invoke(nullnull);//无参则第2个参数设为null.
 
System.Diagnostics.Trace.WriteLine(s);//输出到"调试--窗口--即时窗口"
 
C#反射学习时几点注意内容:
1.指定类库文件必须使用绝对路径,不能使用相对路径(其实感觉有点不合理,不太方便)
3.第5行如果反射的类使用的是静态方法,则第1个参数须调为null
4.由于这个方法有两个参数,可以用这种Object的方法指定参数也可以直接写method.Invoke(obj, new Object[] { "test", 1 });
5.调用的方法是一个静态方法,这时候Invoke的时候,对于第一个参数是无视的,也就是我们写什么都不会被调用,即使我们随便new了一个any这样的Object,当然这种写法是不推荐的。但是对应在例子1种我们如果Invoke的时候用了类型不一致的实例来做为参数的话,将会导致一个运行时的错误。
6.第三个例子是一个调用无参数静态方法的例子,这时候两个参数我们都不需要指定,用null就可以了。
再说一个问题,如果调用的类是静态类的时候,需要注意一个问题,肯定我们会想到一个问题,静态类是不能实例化的,这时候,31行的类的实例化的方法我们就不需要了,直接使用Invoke就可以实现,否则将会出现运行时的错误,同样的道理,第一个参数将会被无视,只要我们传对了参数就可以了。
posted on 2013-09-25 15:40 紫蝶∏飛揚↗ 阅读(597) 评论(0)  编辑  收藏 所属分类: C#

只有注册用户登录后才能发表评论。


网站导航: