三言两语说反射(unity中使用反射)

举报
LittleU 发表于 2022/02/15 10:22:45 2022/02/15
【摘要】 反射(Reflection)的用途反射(Reflection)有下列用途:它允许在运行时查看特性(attribute)信息。它允许审查集合中的各种类型,以及实例化这些类型。它允许延迟绑定的方法和属性(property)。它允许在运行时创建新类型,然后使用这些类型执行一些任务。1.反射指程序可以访问、检测和修改它本身状态或行为的一种能力。2.程序集包含模块,而模块包含类型,类型又包含成员。反射...

反射(Reflection)的用途

反射(Reflection)有下列用途:
它允许在运行时查看特性(attribute)信息。
它允许审查集合中的各种类型,以及实例化这些类型。
它允许延迟绑定的方法和属性(property)。
它允许在运行时创建新类型,然后使用这些类型执行一些任务。
1.

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

2.

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

3.

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

反射是一个十分简单而又灵活的东西,用好了,它就像一只温驯的猫,用不好,它就是被猫玩耍后的毛线团.

优缺点

优点:

1.反射提高了程序的灵活性和扩展性。
2.降低耦合性,提高自适应能力。
3.它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

缺点:

1. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2.使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

Show Code

在unity中新建一个脚本

fqtzn0jwnr.png

这个脚本是需要来反射的
public class Drawed
{
    public int Num1;
    public int Num2;
    public string Str1;
    public Drawed()
    {
        Num1 = 1;
        Num2 = 1;
        Str1 = "Hi,I am Jtro !";
    }

    public int GetNum1()
    {
        return Num1;
    }

    public string GetStr()
    {
        return Str1;
    }

    public string SayHello(string Greeting, string Name)
    {
        return Greeting + "," + Name;
    }
}

然后在新建一个UseDraw脚本,挂在摄像机上

using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;

public class UseDraw : MonoBehaviour
{
    public Drawed drawed = new Drawed();

    string Greeting = "Hello";
    string Name = "I am Jtro";
   
    // Start is called before the first frame update
    void Start()
    {
        MethodInfo getnum1 = drawed.GetType().GetMethod("GetNum1");
        Debug.Log(getnum1.Invoke(drawed, null));

        MethodInfo getstr = drawed.GetType().GetMethod("GetStr");
        Debug.Log(getstr.Invoke(drawed, null));

        MethodInfo sayHello = drawed.GetType().GetMethod("SayHello");
        string [] obj = new string[] {Greeting ,Name };//对于反射中传入值的一个封装
        Debug.Log(sayHello.Invoke(drawed, obj));

    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

其中前两个反射方法很简单,没有传值,第三个方法中呢,是需要传入一些值的 在得到了MethodInfo之后呢,用invoke就可以执行该方法: invoke原型如下表格:

object Invoke (object obj,object[] parameters);

参数

说明

obj

一个对象引用,将调用它所指向的对象上的方法

parameters

所有需要传递方法的参数都必须在parameters数组中指定,如果这个方法中没有参数,那么也要写一个"null"

运行结果如下:

fqtzn0jwnr.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。