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