有关程序及其类型的数据称为元数据,它们保存在程序的程序集中;
运行中的程序查看本身的元数据或者其它程序的元数据的行为称---反射;
要使用反射,必须使用system.reflection命名空间;
Type类
BCL(base class library:基类库)中声明了Type类,它被设计用来包含类型的特征,只用它能获取程序使用类型的信息。
Type是抽象类,因此不能有实例。在运行时,CLR创建Type(RuntimeType)派生类的实例,Type包含类型信息。当访问这些实例时,CLR不会返回派生类的引用而是返回Type基类的引用。
对于程序中的每一个类型,CLR都会创建一个包含这个类型信息的type类型对象;
不管创建的类型有多少个实例,只有一个Type对象会关联到所有的这些实例;
我们几乎可以从Type对象中获取有关类型的所有信息。
using System.Reflection;
void Main()
{
var bc = new BaseClass();
var ab = new A();
//BaseClass[] lst=new UserQuery.BaseClass[]{bc,ab};
//foreach (var element in lst)
//{
// Type type = element.GetType();
// Console.WriteLine($"object type :{type.Name}");
// FieldInfo[] fi=type.GetFields();
// foreach (var f in fi)
// {
// Console.WriteLine($"field :{f.Name}");
// }
//}
Type type = typeof(BaseClass);
type.Name.Dump();
//type.GetFields()[0].Dump();
FieldInfo fi = type.GetField("ID",BindingFlags.NonPublic | BindingFlags.Instance);
if (fi != null)
{
fi.SetValue(bc, 200);
// 由于ID是私有的,无法直接访问,这里我们使用反射来读取它
int idValue = (int)fi.GetValue(bc);
Console.WriteLine(idValue);
}
else
{
Console.WriteLine("Field not found.");
}
}
class BaseClass
{
private int ID=0;
}
class A : BaseClass
{
//public int ID =0;
//public string Name ="daming";
}
获取Type对象
object类型包含一个叫做GetType()的方法,它返回对实例的Type对象的引用。由于每一个类型最终都是从object中派生的,所以我们可以在任何类型上使用后GetType()方法获取它的type对象。
class baseClass{}
Type bc=new baseClass();
bc.GetType(); //获取类型
Type bc=typeof(baseClass); //获取类型
bc.Name.Dump();
2024-08-30
网友评论