关于C#反射机制,来源于网络

反射是种机制,通过这种机制我们可以知道一个未知类型的类型信息,比如,有一个对象a,这个对象不是我们定义的,也许是通过网络捕捉到的,也许是使用泛型定义的,但我们想知道这个对象的类型信息,想知道这个对象有哪些方法或者属性什么的.甚至我们想进一步调用这个对象的方法.关键是现在我们只知道它是一个对象,不知道它的类型,自然不会知道它有哪些方法等信息.这时我们该怎么办?反射机制就是解决这么一个问题的.通过反射机制我们可以知道未知类型对象的类型信息.

再比如,我们有一个dll文件 ,我们想调用里面的类.现在假设这个dll文件 的类的定义,数量等不是固定的,是经常变化的.也许某一天你要在这个dll里面增加一个类定义.也许是说即使改变了dll文件 的定义也不需要改变我们的程序集.这时候 我们就会使用一个未知dll.我们该怎么办?同样,反射机制帮助了我们,我们可以通过反射来实现.说白了,反射就是能知道我们未知类型的类型信息这么一个东西.没什么 神秘可讲.

下面我们来举一个例子.例子的思路是这样的:我们有一个dll.该dll里面有许多关于运动的类.每一个类记录了一种体育运动的信息.我们在另处一个程序里面要知道这个dll的信息:

//第一步:我们在VS中新建一个类库,新建一个抽象类Sport内容如下
using System;
public abstract class Sport
{
protected string name;
public abstract string GetDuration();
public abstract string GetName();
}
//编译第二步:在新建一个类库,这个类库生成的dll就那未知的dll文件,不过要引用第一步生成的dll文件,也就是抽象类Sport,暂时新建3个类内容如下:
using System;
public class Football:Sport
{
public Football()
{
name
= "Football";
}
public override string GetDuration()
{
return "four 15 minute quarters";
}
public override string GetName()
{
return name;
}
}

using System;
public class Hockey:Sport
{
public Hockey()
{
name
= "Hockey";
}
public override string GetDuration()
{
return "three 20 minute periods";
}
public override string GetName()
{
return name;
}
}
using System;
public class Soccer:Sport
{
public Soccer()
{
name
= "Soccer";
}
public override string GetDuration()
{
return "two 45 minute halves";
}
public override string GetName()
{
return name;
}
}



public class Progrom
{
public static void Main(string[] args)
{

Console.Clear();
int i, j;
Assembly assembly
= Assembly.LoadFile("反射Demo实体类.dll");
Type[] types
= assembly.GetTypes();
Console.WriteLine(assembly.GetName().Name
+ "contains the following types");

for (i = 0; i < types.GetLength(0); ++i)
{
Console.WriteLine(
"\r(" + i + ") " + types[i].Name);
}
i
= types.Length - 1;
Console.Write(
"make selection(0-" + i + ");");

j
= Convert.ToInt32(Console.ReadLine());
Console.WriteLine();

if (types[j].IsSubclassOf(typeof(Sport)))
{
ConstructorInfo ci
= types[j].GetConstructor(new Type[0]);
                   Sport sport = (Demo)ci.Invoke(new Object[0]);

Console.WriteLine(sport.GetName()
+ " has " + sport.GetDuration());
}
else
{
Console.WriteLine(types[j].Name
+ " is not a sub-class of Sport");
}

}
}
原文地址:https://www.cnblogs.com/yannis/p/2056420.html