zoukankan      html  css  js  c++  java
  • 小谈一下反射

    在几个情况下:
    1、你的同事给了你一个类库,这个时候你想动态创建dll里的类型的实例,这个参考

    http://msdn.microsoft.com/zh-cn/library/z919e8tw%28v=vs.80%29.aspx

    因为我没弄过

    2、我想获得某个工程里的某一个类的类型
    因为笔者用的多的是这种情况,所以就主要说些这类的东西。

    一个简单的例子

    三个类:

    class Factory

    {

    virtual void Convert(){};

    }

    class AFactory:Factory

    {

    override void Convert(){};

    }

    class BFactory:Factory

    {

    override void Convert(){};

    }

    给两个客户上了程序,两个客户都有一个转换方法,客户一叫做张小二,客户二叫做jime.li,中英文名字差异,要不同的方法去转换,这时候怎么办?

    写两个方法,如果你要是这么想的话,那么我觉得你的工资应该暂时无法提高了,设计模式中的抽象工厂模式听说过嘛,这个有点差不多的意思

                var kele = Assembly.Load("Test");
                var ass = kele.CreateInstance(String.Format("Test.{0}Factory",A或者B) as Factory;

    这就能动态的产生一个类型了,然后可以使用它的override void Convert()了。一个方法解决了,当然这只是一个很简单的小例子

    3、动态使用类成员的方法或者属性

    简单的类:

    class A

    {

    public static readonly temp="init";

    public string Name

    {

    get;set;

    }

    public string GetCalc(string str)

    {

    return "";

    }

    }

    main()

    {

        var type = Type.GetType("Test.A,Test");;--Test是我的工程名,意思是获取这个工程

     string str=type.InvokeMember("Name", BindingFlags.SetProperty, null, null, new object[] { "5555555" }) as string //使用方法;

     type.InvokeMember("GetCalc",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,null,obj,new object[]{1})//设置属性;

     type.InvokeMember("temp", BindingFlags.SetField, null, null, new object[] { "5555555" }); //设置变量,就算是static readonly 照样设置

    }

    一般来说 如果你问一个.net老鸟,static readonly变量如何,得到回答肯定是不能更改,只能在构造函数中设置或者修改,但是反射能在类外进行修改,强大吧!

  • 相关阅读:
    微信小程序动态更改样式
    ionic toggle点击返回true/false支持自定义
    ionic 页面传递参数
    ionic 搜索双向数据绑定失效
    关于select的默认样式问题
    nn
    MVC api json 格式
    iis 500 解决方法
    关于qquu8 的主页修改
    CentOS6.5下MAC
  • 原文地址:https://www.cnblogs.com/fish124423/p/2504258.html
Copyright © 2011-2022 走看看