|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然……系列文章目次索引:《你必需晓得的.NET》
1缘起
老赵在谈表达式树的缓存(2):由表达式树天生字符串中提到,在形貌Type信息时会商FullName大概AssemblyQualifiedName供应完全的Type信息,虽是小话题,但倒是值得有聊的话题。在.NET中反响一个Type称号信息的有以下三个属性,分离是:
- Name,猎取以后成员的称号。
- FullName,猎取Type的完整限制名,包含Type的定名空间,但不包含程序集。
- AssemblyQualifiedName,猎取Type的程序集限制名,个中包含从中加载Type的程序集的称号。现实上,AssemblyQualifiedName被界说为只读abstract属性,详细的完成由其派生类来完成,比方TypeBuilder,我们能够依据其详细完成范例对此有个大抵的懂得。
此处的界说无庸置疑是官方的(MSDN),俗语说,现实是查验真谛的独一尺度,那末这三个邻近的观点,事实代表了如何的分歧,我们回到现实近看分晓。
2畅聊Name
2.1由复杂的入手下手
由复杂入手下手,我们无妨看看object的三个分歧Name前往的现实原形:- staticvoidMain(string[]args){Typet1=typeof(object);Console.WriteLine(t1.Name);Console.WriteLine(t1.FullName);Console.WriteLine(t1.AssemblyQualifiedName);}
复制代码 实行了局呢?
<br>
诚如MSDN所说,Name前往了复杂的范例称号,FullName包括定名空间,而AssemblyQualifiedName则包括程序集全称号。而关于非强称号程序集,其AssemblyQualifiedName仍然前往,相干的程序集信息,比方:- Console.WriteLine(t3.AssemblyQualifiedName);
复制代码 Anytao.Learning.ExpressionTree.One,Anytao.Learning.ExpressionTree,Version=1.0.
0.0,Culture=neutral,PublicKeyToken=null
2.2向庞大过分
假如我们只把眼光停止在复杂范例,那末这三个家伙也不值得花点小工夫来注重了,除复杂,还得庞大。以是,我饶特别是的把Expression拿来抓丁了:- staticvoidMain(string[]args){Typet2=typeof(Expression<Func<int,int>>);Console.WriteLine(t2.Name);Console.WriteLine(t2.FullName);Console.WriteLine(t2.AssemblyQualifiedName);}
复制代码 实行的了局呢?
<br>
明显,关于谜底,引发我们存眷的是在Expression<Func<int,int>>中,其FullName的Func<int,int>范例,和int范例均猎取到其AssemblyQualifiedName,而不是FulName。这留给我们一个年夜年夜的疑问,对其缘故原由举行一点点穷究,我们就能够有如许的思索,Func<T>和int分离存在于System.Core和mscorlib程序集,关于我们自己程序集而言,完整有大概在其他援用程序会合引进一个FullName不异的Assembly,以是为独一限制起见,以AssemblyQualifiedName标示Func<T>和int是完整准确的。
批准的成绩,存在于List<T>等其他范例。任何可交换范例参数的实践范例,都大概由分歧程序集的加载而变得不敷“独一”,以是AssemblyQualifiedName来限制List<T>的FullName是明智的。
2.3特地看看Type.ToString()
Type范例另有一个ToString(),用于前往Type的Name,那末这个Name事实是这三其中的哪个呢?假如看了谜底,你一定又一次溃散:- staticvoidMain(string[]args){Typet1=typeof(object);Typet2=typeof(Expression<Func<int,int>>);Typet3=typeof(One);Typet4=typeof(List<int>);Console.WriteLine(t1.ToString());Console.WriteLine(t2.ToString());Console.WriteLine(t3.ToString());Console.WriteLine(t4.ToString());}
复制代码
<br>
固然很无语,Type.ToString()现实上并未前往Name、FullName大概AssemblyQualifiedName,而是不完整的FullName,详细就不做过量报告了,我们能够由了局看得很分明。
3回到成绩
明显,FullName在一个程序会合是独一限制的,包括了地点的定名空间,而AssemblyQualifiedName则更包括其程序集称号,关于庞大范例的比方List<T>如许的范例,即使是FullName也将以AssemblyQualifiedName显现其范例参数,以是关于老赵的计划FullName是完整能够胜任为分歧Type完成独一key值的需求。
你以为呢?
公布日期:2009.3.18Anytao
|
|