C#反射(Reflection)

23 篇文章 2 订阅

什么是反射

指程序可以访问、检测和修改它本身状态或行为的一种能力。

程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。

您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性

为什么使用反射

  • 获取类型的相关信息
  • 动态调用方法
  • 动态构造对象
  • 从程序集中获得类

如何使用

以上都是抄的,下边自己写

一般来说,我们想看一个类,就是按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()
    {
 
    }
}

结果

来个类图

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值