反射(Type类)
什么是元数据,什么是反射
程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据。
有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中。
程序在运行时,可以查看其它程序集或其本身的元数据。一个运行的程序查看本身的元数据或者其他程序集的元数据的行为叫做反射。
下面我们我们来学习如何使用Type类来反射数据,以及如何使用特性来给类型添加元数据。 Type位于System.Reflection命名空间下
Type类
预定义类型(int long 和string等),BCL中的类型(Console,IEnumerable等)和程序员自定义类型(MyClass,MyDel等)。 每种类型都有自己的成员和特性。
BCL声明了一个叫做Type的抽象类,它被设计用来包含类型的特性。使用这个类的对象能让我们获取程序使用的类型的信息。
由于 Type是抽象类,因此不能利用它去实例化对象。关于Type的重要事项如下:
- 对于程序中用到的每一个类型,CLR都会创建一个包含这个类型信息的Type类型的对象。
- 程序中用到的每一个类型都会关联到独立的Type类的对象。
- 不管创建的类型有多少个示例,只有一个Type对象会关联到所有这些实例。
System.Type类常用成员
成员 | 成员类型 | 描述 |
---|---|---|
Name | 属性 | 返回类型的名字 |
Namespace | 属性 | 返回包含类型声明的命名空间 |
Assembly | 属性 | 返回声明类型的程序集 |
GetFields | 方法 | 返回类型的字段列表 |
GetProperties | 方法 | 返回类型的属性列表 |
GetMethods | 方法 | 返回类型的方法列表 |
获取Type对象
获取Type对象有两种方式
1,Type t = myInstance.GetType();//通过类的实例来获取Type对象
//在object类有一个GetType的方法,返回Type对象,因为所有类都是从object继承的,所以我们可以在任何类型上使用GetType()来获取它的Type对象
2,Type t = typeof(ClassName);//直接通过typeof运算符和类名获取Type对象
获取里面的属性
FieldInfo[] fi = t.GetFields();
foreach(FieldInfo f in fi){
Console.WriteLine(f.Name+" ");
}
public class Dog
{
private string _name;
public string Name {
get{ return _name; }
set{ _name = value; }
}
private string _color;
public string Color {
get{ return _color; }
set{ _color = value; }
}
public Dog (string name, string color)
{
Name = name;
Color = color;
}
public void run() {
Console.WriteLine(Color + "的" + Name + "狗正在跑");
}
public void jump() {
Console.WriteLine(Color + "的" + Name + "狗正在跳");
}
}
class MainClass
{
public static void Main (string[] args)
{
Dog dog = new Dog ("阿里", "黄色");
Type t = dog.GetType ();
Console.WriteLine (t.GetType());
Console.WriteLine (t.Name);
Console.WriteLine (t.Namespace);
Console.WriteLine (t.Assembly);
foreach (FieldInfo fieldInfo in t.GetFields()) {
Console.WriteLine (fieldInfo);
}
foreach (PropertyInfo propertyInfo in t.GetProperties()) {
Console.WriteLine (propertyInfo);
}
foreach (MethodInfo methodInfo in t.GetMethods()) {
Console.WriteLine (methodInfo);
}
}
}
输出
System.MonoType
Dog
TypeTest
TypeTest, Version=1.0.6495.18928, Culture=neutral, PublicKeyToken=null
System.String Name
System.String Color
System.String get_Name()
Void set_Name(System.String)
System.String get_Color()
Void set_Color(System.String)
Void run()
Void jump()
Boolean Equals(System.Object)
Int32 GetHashCode()
System.Type GetType()
System.String ToString()