下面这段伪代码是我自己总结的,如果有错误请指出,谢谢
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
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的类。
当然这是编辑时的把戏,必须要重新编译代码。