小谈一下反射

在几个情况下:
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变量如何,得到回答肯定是不能更改,只能在构造函数中设置或者修改,但是反射能在类外进行修改,强大吧!

原文地址:https://www.cnblogs.com/fish124423/p/2504258.html