.Net 反射学习
程序员文章站
2022-11-10 21:27:23
Why?为什么使用反射 MVC ORM EF 都是用的反射。反射可以让程序的扩展性,灵活性得到加强。一起即可动态创建 what 反射原理 动态加载类库 ,先添加引用类库,或者复制debug里面的文件dll到运行文件Debug Assembly assembly = Assembly.Load("We ......
why?为什么使用反射
mvc orm ef 都是用的反射。反射可以让程序的扩展性,灵活性得到加强。一起即可动态创建
what 反射原理
动态加载类库 ,先添加引用类库,或者复制debug里面的文件dll到运行文件debug
assembly assembly = assembly.load("weiai.db.mysqlhelper");//反射生成类库 使用assembly ,load方法 里面填写namespace
foreach (var item in assembly.getmodules()) //遍历类库的dll文件
{
console.writeline(item.name);
}
foreach (var item in assembly.gettypes())//遍历类库的类型
{
console.writeline(item.name);
foreach (var act in item.getmethods())//遍历类的方法
{
console.writeline(act.name);
}
foreach (var item in assembly.getmodules()) //遍历类库的dll文件
{
console.writeline(item.name);
}
foreach (var item in assembly.gettypes())//遍历类库的类型
{
console.writeline(item.name);
foreach (var act in item.getmethods())//遍历类的方法
{
console.writeline(act.name);
}
}
反射创建对象并调用方法
assembly assembly = assembly.load("weiai.db.mysqlhelper"); //反射类库
type type = assembly .gettype("weiai.db.mysqlhelper.mysqlhelper");//反射类型
object obj = activator.createinstance(type,null);//动态创建类的对象
isqlhelper mysql = omysql as isqlhelper;// isqlhelper 是创建的一个接口,mysqlhelper实现了这个接口,所以它类的对象可以转换
mysql.query();//调用方法
创建不同的对象:
1、无参对象:
object obj = activator.createinstance(type,null);
2、有参对象 int参数为例:
object obj = activator.createinstance(type,new object[]{11});
3、创建泛型对象
type generictype = assembly.createinstance("weiai.db.mysqlhelper.genericclass`3");//genericclass为泛型类 有3个泛型,就写数字3
type ty1 =generictype.makegenerictype(new type[]{typeof{int},typeof{string},typeof{int}});
object obj =activator.createinstance(ty1,new object[]{11,"hello",123});//三个有参构造函数
object obj =activator.createinstance(ty1,null);//无参构造函数
调用不同的方法:
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show1");//无参方法
method.invoke(ob1, null);
}
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show2", new type[] { typeof(int) });//有一个参方法
method.invoke(ob1, new object[] { 12 });
}
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show3", new type[] { typeof(int), typeof(string) });//有两个参方法
method.invoke(ob1, new object[] { 12, "haha" });
}
{
//type mytype1 = assembly.gettype("weiai.db.mysqlhelper.genericmethod");
//object ob1 = activator.createinstance(mytype1);
//methodinfo method = mytype1.getmethod("show");
//methodinfo methodnew= method.makegenericmethod(new type[] { typeof(int),typeof(string),typeof(double) });
//methodnew.invoke(ob1,new object[] { 12,"jianghao",123456});
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show4");
methodinfo methodnew = method.makegenericmethod(new type[] { typeof(int) });//泛型方法
methodnew.invoke(ob1, new object[] { 123123123 });
}
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show5");//静态方法
method.invoke(null, null);
}
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show6");//带返回值的方法
object result = method.invoke(ob1, null);
console.writeline(result);
}
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show1");//无参方法
method.invoke(ob1, null);
}
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show2", new type[] { typeof(int) });//有一个参方法
method.invoke(ob1, new object[] { 12 });
}
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show3", new type[] { typeof(int), typeof(string) });//有两个参方法
method.invoke(ob1, new object[] { 12, "haha" });
}
{
//type mytype1 = assembly.gettype("weiai.db.mysqlhelper.genericmethod");
//object ob1 = activator.createinstance(mytype1);
//methodinfo method = mytype1.getmethod("show");
//methodinfo methodnew= method.makegenericmethod(new type[] { typeof(int),typeof(string),typeof(double) });
//methodnew.invoke(ob1,new object[] { 12,"jianghao",123456});
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show4");
methodinfo methodnew = method.makegenericmethod(new type[] { typeof(int) });//泛型方法
methodnew.invoke(ob1, new object[] { 123123123 });
}
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show5");//静态方法
method.invoke(null, null);
}
{
object ob1 = activator.createinstance(mytype);
methodinfo method = mytype.getmethod("show6");//带返回值的方法
object result = method.invoke(ob1, null);
console.writeline(result);
}
反射类的属性和字段,并且动态赋值或者获取值
type type = typeof(person);
person operson = (person)activator.createinstance(type);
operson.id = 123;
operson.name = "hai";
operson.age = 18;
operson.description = "1111111111111111";
// person person = new person();
foreach (var item in type.getproperties())//属性
{
console.writeline(item.name);
console.writeline(item.getvalue(operson));
if (item.name.equals("id"))
{
item.setvalue(operson, 12);
}
if (item.name.equals("name"))
{
item.setvalue(operson, "jianghao");
}
if (item.name.equals("age"))
{
item.setvalue(operson, 22);
}
if (item.name.equals("description"))
{
item.setvalue(operson, "hahahahaha");
}
console.writeline(item.getvalue(operson));
}
foreach (var item in type.getfields())//字段
{
console.writeline(item.name);
}
person operson = (person)activator.createinstance(type);
operson.id = 123;
operson.name = "hai";
operson.age = 18;
operson.description = "1111111111111111";
// person person = new person();
foreach (var item in type.getproperties())//属性
{
console.writeline(item.name);
console.writeline(item.getvalue(operson));
if (item.name.equals("id"))
{
item.setvalue(operson, 12);
}
if (item.name.equals("name"))
{
item.setvalue(operson, "jianghao");
}
if (item.name.equals("age"))
{
item.setvalue(operson, 22);
}
if (item.name.equals("description"))
{
item.setvalue(operson, "hahahahaha");
}
console.writeline(item.getvalue(operson));
}
foreach (var item in type.getfields())//字段
{
console.writeline(item.name);
}
上一篇: 没有爱情的婚姻还能继续吗
下一篇: 单身久了就下了我要恋爱的决心