标签:同构 typeIdentifier 全名 list 查找 指令 FindType 类型 using
原文链接:http://www.cnblogs.com/zhy2002/archive/2008/07/23/1249126.html下面这段伪代码是我自己总结的,如果有错误请指出,谢谢
1一定要分清楚C#编译器的要求和CLR的要求。C#的类型定位规则是:
2 [方法]Type FindType(string fullname)::=在本程序集以及所有被引用的程序集中查找全名(完全限定名)为fullname的类型。本方法不会返回null,如果不存在符合条件的Type或者存在的Type多于一个,则抛出相应的异常。
3 //level1
4 If(typeIdentifier.startWith(“global::”))
5 { //如果类型标识符以’global::’开头,那么后面的部分构成一个类型全名
6 //如果没有找到类型,则查找失败
7 return FindType(typeIdentifier.removePrefixChar(8));
8}
9//level2
10// NamingContainer是能够在其中定义类型的构造
11// CurrentNamingContainer是包含本类型标识符的最近的类型定义容器(如home class)
12NamingContainer = CurrentNamingContainer;
13do
14{
15try
16{ //第一次查找是否是成员,而后依次在更上一级容器中查找
17
18 return FindType (CurrentNameingContainer.Name + “.”+ typeIdentifier);
19 }finally{}
20}
21while(NamingContainer.parent != global)
22//最后一次查找是否是global中的类型,也就是用typeIdentifier本身作为全名查找
23 try
24{
25 return FindType (typeIdentifier);
26}finally{}
27 //以上两个级别的查找先于使用using进行的查找的。
28
29//level3
30List<Type> list = new List<Type>(1);
31Foreach(usingNSPrefix in AllUsingNSPrefix)
32{ //所有由using语句引入的命名空间前缀是平级的
33 try
34 {
35 list.Add(FindType usingNSPrefix + “.” + (typeIdentifier));
36}finally{}
37}
38if(list.Count > 1)
39{
40 throw new Exception(“类型名称歧义”);
41}
42if(list.Count == 0)
43{
44 throw new Exception(“没有找到类型”);
45}
46return list[0];
47//如果被引用的所有程序集中,定义了全名相同的类,那么在程序中不可引用这个类,否则无论如何会出现异常。根据FindType方法的定义可知,C#编译器是期待包括被编译模块在内的所有程序集中没有全名相同的类,否则FindType方法总会发生异常。
48
level2很巧妙,我们可以通过这个规则来实现一个类以覆盖原来的处于level3的类。
当然这是编辑时的把戏,必须要重新编译代码。
转载于:https://www.cnblogs.com/zhy2002/archive/2008/07/23/1249126.html
标签:同构,typeIdentifier,全名,list,查找,指令,FindType,类型,using 来源: https://blog.csdn.net/weixin_30718391/article/details/96570666
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。