object[] consargs = new object[2];
consargs[0] = 10;
consargs[1] = 20;
object reflectOb = ci[x].Invoke(consargs); //实例化一个这个构造函数有两个参数的类型对象,如果参数为空,则为null
//实例化后,调用MyClass中的方法
MethodInfo[] mi = t.GetMethods(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance);
foreach (MethodInfo m in mi)
{
if (m.Name.Equals("sum", StringComparison.Ordinal))
{
val = (int)m.Invoke(reflectOb, null); //由于实例化类型对象的时候是用的两个参数的构造函数,所以这里返回的结构为30
Console.WriteLine(" sum is " + val); //输出 sum is 30
}
}
Console.ReadKey();
}
}
从程序集获得类型
在这之前的阐述中可以看出一个类型的所有信息都能够通过反射得到,但是MyClass类型本身,我们却没有做出获取。虽然前面的阐述实例,可以动态确定MyClass类的信息,但是他们都是基于以下事实:预先知道类型名,并且在typeof语句中使用它获得Type对象。尽管这种方式可能在很多种情况下都很管用,但是要发挥反射的全部功能,我们还需要分析程序集的内容来动态确定程序的可用类型。
借助Reflection API,可以加载程序集,获取它的相关信息并创建其公共可用类型的实例。通过这种机制,程序能够搜索其环境,利用潜在功能,而无需在编译期间显式的定义他们。这是一个非常有效,且令人兴奋的概念。
为了说明如何获取程序集中的类型,我创建两个文件。第一个文件定义一组类,第二个文件则反射各个类的信息。 代码效果如下。
1.这下面代码是要编译生成MyClass.exe文件的
复制代码 代码如下:
View Code
class MyClass
{
int x;
int y;
public MyClass(int i)
{
x = y + i;
}
public MyClass(int i, int j)
{
x = i;
y = j;
}
public int sum()
{
return x + y;
}
}
class Demo
{
static void Main()
{
Console.WriteLine("hello word !");
Console.ReadKey();
}
}
2.这下面的代码是获取上面生成程序集的
复制代码 代码如下:
View Code
class Class3
{
static void Main() {
Assembly asm = Assembly.LoadFrom(@"C:\Users\lenovo\Documents\visual studio 2010\Projects\Reflection_test\ConsoleApplication1\bin\Debug\MyClass.exe"); //加载指定的程序集
Type[] alltype = asm.GetTypes(); //获取程序集中的所有类型列表
foreach (Type temp in alltype)
{
Console.WriteLine(temp.Name); //打印出MyClass程序集中的所有类型名称 MyClass , Demo
}
Console.ReadKey();