欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.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);
             }
     }    

 
反射创建对象并调用方法
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);
}
 
 
反射类的属性和字段,并且动态赋值或者获取值
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);
}