2.否则,“命名空间或类型名称”的形式为 N.I,其中 N 是由除最右边的标识符以外的所有标识符组成的“命名空间或类型名称”,I 是最右边的标识符。N 最先按“命名空间或类型名称”解析。如果对 N 的解析不成功,则发生编译时错误。否则,N.I 按下面这样解析:
a.如果 N 是一个命名空间而 I 是该命名空间中可访问成员的名称,则 N.I 引用该成员,并根据该成员归为命名空间或类型类别。
还是举个例子把:
using System;
public class testcs {
public static void test() {
Console.WriteLine("test method.........");
}
}
把这个文件编译:csc /t:library /out:test.dll test.cs
然后这样用:
LoadFrom方法从指定的文件名下载程序集,文件名可以带路径。程序集必须下载才能用。你在运行一个exe文件时,系统自动下载与这个程序集有关联的所有程序集;也可以用Load方法,参数为这个程序集的全名(也就是程序集的标识:程序集的标识由简单名称、版本号、加密密钥对和支持的区域性组成。简单名称是非加密名称,这一点与强名称不同。强名称是由加密的公钥和私钥对来确保安全性的程序集名称。)
GetTypes()方法返回这个程序集定义的所有的类,也可以用GetType方法,参数为你想要得到的类型的名字;
GetMembers是Type里的方法,得到这个类型里定义的成员,可以指定条件,具体请看Type的GetMembers的文档;
Invoke是MethodInfo的方法,调用这个方法。
using System;
using System.Reflection;
public class testcs {
public static void Main() {
Assembly ass = Assembly.LoadFrom("test.dll");
Type[] t = ass.GetTypes();
for (int i = 0; i < t.Length; i++) {
MemberInfo[] mi = t[i].GetMembers(BindingFlags.Public|BindingFlags.Static);
Console.WriteLine(mi[i]);
if (mi[i] is MethodInfo) {
((MethodInfo) mi[i]).Invoke(null,null);
}
}
}
}
整个Reflection包和System.Type都与Assembly密切联系,可以看相关的文档加深理解。