//*********创建实例***********
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(null, new string[] { "test" }); //如果是静态方法,第1个参数则忽略,设为null
//无参的静态方法
method = type.getmethod("noneparawritestring");
method.invoke(null, null);//无参则第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
紫蝶∏飛揚↗ 阅读(562)
评论(0) 编辑 收藏 所属分类:
c#