C#反射(Reflection)
什么是反射
指程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
为什么使用反射
- 获取类型的相关信息
- 动态调用方法
- 动态构造对象
- 从程序集中获得类
如何使用
以上都是抄的,下边自己写
一般来说,我们想看一个类,就是按F12,查看定义。
那如何用代码获取一个类是怎么定义的呢。
Unity写个脚本挂上去,自己看控制台就行.
sing System;
using System.Reflection;
using UnityEngine;
using System.Text;
using Valve.VR;
[ExecuteInEditMode]
public class TimorReflection : MonoBehaviour
{
void OnEnable()
{
Type t = typeof(ReflectionText);
GetFields(t);
GetPropertys(t);
GetMethods(t);
//GetMembers(t);
Debug.ClearDeveloperConsole();
}
/// <summary>
/// 获取字段
/// </summary>
/// <param name="t"></param>
public void GetFields(Type t)
{
Debug.Log("<b>" + t.Name + "的字段…………………………</b>");
FieldInfo[] fieldInfos = t.GetFields();
foreach (FieldInfo field in fieldInfos)
{
Debug.Log("类型: " + "<b><color=#4EC9B0>" + field.FieldType.Name + "</color></b>" + field.Name);
}
}
/// <summary>
/// 获取属性
/// </summary>
/// <param name="t"></param>
public void GetPropertys(Type t)
{
Debug.Log("<b>" + t.Name + "的属性…………………………</b>");
PropertyInfo[] propertyInfos = t.GetProperties();
foreach (PropertyInfo property in propertyInfos)
{
Debug.Log("类型: " + "<b><color=#4EC9B0>" + property.PropertyType.Name + "</color></b>" + "名称: " + property.Name);
}
}
/// <summary>
/// 获取方法
/// </summary>
/// <param name="t"></param>
public void GetMethods(Type t )
{
Debug.Log("<b>" + t.Name + "的方法…………………………</b>");
MethodInfo[] methodInfos = t.GetMethods();
StringBuilder parameter = new StringBuilder();
foreach (MethodInfo method in methodInfos)
{
ParameterInfo[] parameterInfos = method.GetParameters();
foreach (ParameterInfo p in parameterInfos)
{
parameter.Append("<b><color=#4EC9B0>" + p.ParameterType.Name + "</color></b>" +" "+ p.Name + ",");
}
Debug.Log("返回类型: " + "<b><color=#4EC9B0>" + method.ReturnType.Name + "</color></b>" + "方法名: " + method.Name + " 参数类型: " + parameter.ToString());
}
}
/// <summary>
/// 获取成员
/// </summary>
/// <param name="t"></param>
public void GetMembers(Type t)
{
Debug.Log("<b>" + t.Name + "的成员…………………………</b>");
MemberInfo[] memberInfos = t.GetMembers();
foreach (MemberInfo member in memberInfos)
{
Debug.Log("类型: " + "<b><color=#4EC9B0>" + member.MemberType + "</color></b>" + member.Name);
}
}
}
public class ReflectionText
{
private int index = 0;
public string text = "dsa";
private int number;
public int Number
{
get { return 0; }
}
public Vector3 Pos
{
set
{
Pos = value;
}
}
public int Add(Vector2 d)
{
return 0;
}
public void Add(int i,int b,string cs,Vector3 c,GameObject go)
{
}
private void Text()
{
}
public ReflectionText()
{
}
}
结果
来个类图