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()
    {
 
    }
}

结果

来个类图

发布了57 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_35030499/article/details/89349266