|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。 在.NetFramework2.0中引进了范型(Generic)的观点,这能够说是一个严重的改善它的优点我在这里也不必多说,到网上能够找到十分多的申明。
我在这里要和人人说的是怎样经由过程反射利用范型的手艺。
一:起首看看范型的FullName
List<string>list=newList<string>();
System.Console.WriteLine(list.GetType().FullName);
System.Console.WriteLine();
这个语句失掉的是:
System.Collections.Generic.List`1[[System.String,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]。
好长呀,剖析一下个中的格局会看出一下几个东东。
System.Collections.Generic.List->申明该Type是甚么范例的。
1、->应当是范型的标记。
System.String,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089->是string范例的FullName。
那末在看看这个语句会呈现甚么?
Dictionary<string,int>dic=newDictionary<string,int>();
System.Console.WriteLine(dic.GetType().FullName);
System.Console.WriteLine();
了局是:
System.Collections.Generic.Dictionary`2[[System.String,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.Int32,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]。
更长,剖析一下:
System.Collections.Generic.Dictionary->申明该Type是甚么范例的。
2->仍是是范型的标记。
System.String,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089->是string范例的FullName。
System.Int32,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089->是int范例的FullName。
从下面的例子能够看出范型的范例和1.1时增添了两个部分,分离是范型的标识部分和范型的参数范例FullName部分。
起首看一下标记部分`1和`2,推测`标识了该范例是范型、前面的数字部分是申明了该范型必要几个范型参数。
如今仍是推测,上面依据推测来使用我们本人的反射实验一下吧:
二:范型反射的实验
看看上面的代码:
stringtlistStr="System.Collections.Generic.List`1[System.String]";
TypetList=Type.GetType(tlistStr);
Objectolist=System.Activator.CreateInstance(tList);
MethodInfoaddMList=tList.GetMethod("Add");
addMList.Invoke(olist,newobject[]{"zhx"});
Console.WriteLine(olist.ToString());
System.Console.WriteLine();
stringtDicStr="System.Collections.Generic.Dictionary`2[[System.String],[System.Int32]]";
TypetDic=Type.GetType(tDicStr);
ObjectoDic=Activator.CreateInstance(tDic);
MethodInfoaddMDic=tDic.GetMethod("Add");
addMDic.Invoke(oDic,newobject[]{"zhx",1});
Console.WriteLine(oDic.ToString());
System.Console.WriteLine();
测试经由过程。不外人人要注重了。范型中的基本范例如:string,int不克不及利用简写的,假如把System.Collections.Generic.List`1[System.String]写成System.Collections.Generic.List`1[string]是不克不及够失掉准确范例的。
三:自已界说的范型反射的利用
起首本人界说一个范型类:
namespaceRefTest
{
publicclassBaseClass<T,V,O>
{
Tt;
Vv;
Oo;
publicvoidSetValue(Tpt,Vpv,Opo)
{
this.t=pt;
this.v=pv;
this.o=po;
}
publicoverridestringToString()
{
returnstring.Format("T:{0}V:{1}O:{2}",t.ToString(),v.ToString(),o.ToString());
}
}
}
利用反射创立范例和挪用办法:
stringtBaseClassStr="RefTest.BaseClass`3[[System.String],[System.Int32],
[System.Collections.Generic.Dictionary`2[[System.String],[System.Int32]]]]";
TypetBaseClass=Type.GetType(tBaseClassStr);
ObjectoBaseClass=Activator.CreateInstance(tBaseClass);
MethodInfoaddMBaseClass=tBaseClass.GetMethod("SetValue");
addMBaseClass.Invoke(oBaseClass,newobject[]{"zhx",1,oDic});
Console.WriteLine(oBaseClass.ToString());
System.Console.WriteLine();
测试乐成。也不知道,我同学昨天说数据挖掘很好。 |
|