当前位置: 移动技术网 > IT编程>开发语言>.net > .Net 反射学习

.Net 反射学习

2019年02月13日  | 移动技术网IT编程  | 我要评论

电视剧十二生肖传奇,xoxo组合,4d肉搏团

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网