共计 1936 个字符,预计需要花费 5 分钟才能阅读完成。
反射
反射是指对程序集中的元数据(如:办法、类型、参数、字段、属性、自定义个性等)进行查看的过程。咱们是通过 System.Type 的实例来拜访类型的元数据。
应用 System.Type 拜访元数据
读取类型的元数据,首先要取得 System.Type 的一个实例,它代表了指标类型实例。System.Type 提供了获取类型信息的所有办法。次要是通过 object.GetType() 和 typeof()操作符达到这个目标。
- 应用 GetType()
Object 对象蕴含一个 GetType() 成员,胜利调用 GetType()的关键在于取得一个对象实例。例如:动态类无奈实例化,无奈调用 GetType()。
DateTime dateTime = new DateTime();
Type type = dateTime.GetType();
// 获取该类型的所有公共属性
foreach (System.Reflection.PropertyInfo property in type.GetProperties())
{Console.WriteLine(property.Name);
}
输入:
-
typeof()
在编译时绑定到特定的 Type 实例,并间接获取类型作为参数。int value = (int)Enum.Parse(typeof(ThreadPriorityLevel), "Idle"); Console.WriteLine(value);
也能够应用 typeof 表达式验证 value 对象的类型:
if (value.GetType() == typeof(int)) {// ...}
其中 GetType() 在运行时返回对象的类型(早期绑定),typeof() 返回指定类的类型(晚期绑定,编译时已知)
尽量采纳 typeof() 这个操作符获取 Type 对象,因为操作符生成的代码通常更快。
成员调用
应用 System.Type 拜访元数据后,可调用他们。
public class MagicClass
{
private int magicBaseValue;
public MagicClass()
{magicBaseValue = 9;}
public int ItsMagic(int preMagic)
{return preMagic * magicBaseValue;}
}
class Program
{static void Main(string[] args)
{
// 获取构造函数,并创立一个 MagicClass 的实例
Type magicType = typeof(MagicClass);
ConstructorInfo magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
object magicClassObject = magicConstructor.Invoke(new object[] {});
// 获取 ItsMagic 办法并应用 100 的参数值进行调用
MethodInfo magicMethod = magicType.GetMethod("ItsMagic");
// Invoke 办法第一个值为:要在其上调用办法或构造函数的实例对象
// Invoke 办法第一个值为:被调用办法或构造函数的参数列表。object magicValue = magicMethod.Invoke(magicClassObject, new object[] {100});
Console.WriteLine("MethodInfo.Invoke()");
Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue);
}
后果:
泛型类型上的反射
- 在泛型类型上执行运行时反射,能够判断类型参数的类型:
public class Stack1<T>
{public void Add(T i)
{
// 判断类型参数的类型
Type t = typeof(T);
}
}
在取得类型参数的 Type 对象实例化后,就可在类型参数上执行反射,从而判断他的行为,并针对具体类型来调整 Add 办法,使其能更无效地反对这种类型。
- 为泛型类或办法获取类型参数
public class Stack1<T>
{public void Add(T i)
{
// 判断类型参数的类型
Type t = typeof(T);
}
}
class Program
{static void Main(string[] args)
{
// 2、为泛型类或办法获取类型参数
Type t = typeof(Stack1<int>);
foreach (Type t1 in t.GetGenericArguments())
{Console.WriteLine("Type parameter:" + t1.FullName);
}
}
后果:
正文完