引言

使用[Inject]标签,可以根据字段类型自动注入一些数据 是非常好使用 方便调用类与类之间的成员 和 函数 避免重复获取组件 游戏开始只读取一次 就可以直到游戏关闭为止

注入方式(成功 和 注销)

新建XX类 需要挂到Hierarchy面板上 任意一个物体
举个子列先挂到Canvas 需要注入A类
代码如下:
public class XX : MonoBehaviour
{
void Awake()
{
A a = GameObject.Find(“Canvas”).GetComponent< A >();
EasyInjector.Instance.AddInject(a);
}

void OnDestroy()
{EasyInjector.Instance.RemoveInject<A>();
}

}

注意一点: 必须要说到 A类注入成功了 在Awake 里面函数 但是如果切换场景时, 那就必须要移除 A类注入方式 在OnDestroy()函数里面 , 如果再切回来场景时发现之前注入A类 没有被注销的话 就会导致重复注入A类成功 就会出现其他未知BUG

使用方式

由于上面已经讲了如何注入和注销,如何使用 首先必须要继承MonoInjected ,单独写一个MonoInjected
代码如下
// 可注入的Mono基类,所有子类如果复写Awake, 需要base.Awake();

public class MonoInjected : MonoBehaviour
{
protected virtual void Awake()
{
EasyInjector.ReflectionInject(this);
}
}

只允许继承它 才可以使用注入标签方式

比如你A类 需要调用B类一些成员那么 代码如下

public class A : MonoInjected
{
[Inject]
public B m_b { get; set; };

public void Start()
{m_b.成员或者函数;//前提是 B类成员和函数 得public 公开 否则无法调用
}

}

注入工具代码

直接上代码

public class EasyInjector
{
protected Dictionary<Type, object> m_dicInjection; // 注入的类型和实例

protected Dictionary<Type, List<InjectVO>> m_dlInjected;   // 已成功注入属性
protected Dictionary<Type, List<InjectVO>> m_dlUnjected;   // 未成功注入属性protected static EasyInjector _instance = null;
public static EasyInjector Instance
{ get {if (_instance == null){_instance = new EasyInjector();_instance.m_dicInjection = new Dictionary<Type, object>();_instance.m_dlInjected = new Dictionary<Type,List<InjectVO>>();_instance.m_dlUnjected = new Dictionary<Type,List<InjectVO>>();}return _instance;}
}

//调用 注入成功函数

public void AddInject<T>(T obj)
{Type tt = typeof(T);if (m_dicInjection.ContainsKey(tt))m_dicInjection[tt] = obj;elsem_dicInjection.Add(tt, obj);if (m_dlUnjected.ContainsKey(tt)){if (!m_dlInjected.ContainsKey(tt))m_dlInjected.Add(tt, new List<InjectVO>());foreach (InjectVO ij in m_dlUnjected[tt]){ij.injectPpt.SetValue(ij.injectObj, obj, null);m_dlInjected[tt].Add(ij);}m_dlUnjected.Remove(tt);}
}public void AddInject(Type type, object obj)
{if (m_dicInjection.ContainsKey(type))m_dicInjection[type] = obj;elsem_dicInjection.Add(type, obj);if (m_dlUnjected.ContainsKey(type)){if (!m_dlInjected.ContainsKey(type))m_dlInjected.Add(type, new List<InjectVO>());foreach (InjectVO ij in m_dlUnjected[type]){ij.injectPpt.SetValue(ij.injectObj, obj, null);m_dlInjected[type].Add(ij);}m_dlUnjected.Remove(type);}
}

// 需要注销注入 调用移除函数

public void RemoveInject<T>()
{Type tt = typeof(T);if (m_dicInjection.ContainsKey(tt))m_dicInjection.Remove(tt);if (m_dlInjected.ContainsKey(tt)){if (!m_dlUnjected.ContainsKey(tt))m_dlUnjected.Add(tt, new List<InjectVO>());foreach (InjectVO ij in m_dlInjected[tt]){ij.injectPpt.SetValue(ij.injectObj, null, null);m_dlUnjected[tt].Add(ij);}m_dlInjected.Remove(tt);}
}public T GetInject<T>()
{Type tt = typeof(T);if (m_dicInjection.ContainsKey(tt))return (T)m_dicInjection[tt];return default(T);
}public object GetInject(Type t)
{if (m_dicInjection.ContainsKey(t))return m_dicInjection[t];return null;
}protected void Injection(object injectTarget)
{Type tp = injectTarget.GetType();MemberInfo[] members = tp.FindMembers(MemberTypes.Property,BindingFlags.FlattenHierarchy |BindingFlags.SetProperty |BindingFlags.Public |BindingFlags.Instance,null, null);foreach (MemberInfo member in members){object[] injections = member.GetCustomAttributes(typeof(Inject), true);if (injections.Length > 0){//Inject attr = injections[0] as Inject;PropertyInfo ppt = member as PropertyInfo;Type pptType = ppt.PropertyType;var obj = EasyInjector.Instance.GetInject(pptType);if (obj == null)  // 尚未注入的对象{if (!m_dlUnjected.ContainsKey(pptType))m_dlUnjected.Add(pptType, new List<InjectVO>());m_dlUnjected[pptType].Add(new InjectVO(injectTarget, ppt));}else  // 已注入的对象{if (!m_dlInjected.ContainsKey(pptType))m_dlInjected.Add(pptType, new List<InjectVO>());m_dlInjected[pptType].Add(new InjectVO(injectTarget, ppt));ppt.SetValue(injectTarget, obj, null);}}}
}public static void ReflectionInject(object c)
{EasyInjector.Instance.Injection(c);
}public class InjectVO
{public object injectObj;public PropertyInfo injectPpt;public InjectVO(object target, PropertyInfo pptInfo) { injectObj = target;injectPpt = pptInfo;}
}

}

// 在非Mono中使用注入,需要在类构造函数中调用 EasyInjector.ReflectionInject(this);

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false,Inherited = true)]
public class Inject : Attribute
{
public Inject() { }

public Inject(object n)
{name = n;
}public object name { get; set; }

}

C# 注入工具方式[Inject]相关推荐

  1. 命令注入工具Commix

    命令注入工具Commix 命令注入(Command Injection)攻击是针对Web应用的一种攻击方式.很多Web应用会读取用户提交的数据,然后传递到系统Shell,执行特定的操作,如为用户创建单 ...

  2. 【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★

    文章目录 一.Android 进程注入工具开发系列博客 二.Android 进程注入工具 源码下载编译 三.逆向环境搭建 四.使用注入工具进行逆向操作 1.获取远程进程号 2.注入工具准备 3.注入动 ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )

    文章目录 前言 一.Android 进程读取文件所需的权限 二.fopen 打开文件标志位 三.验证文件权限 前言 一.Android 进程读取文件所需的权限 通过 注入工具 , 将 libbridg ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )

    文章目录 一.dlopen 函数简介 二.获取 目标进程 linker 中的 dlopen 函数地址 三.远程调用 目标进程 linker 中的 dlopen 函数 一.dlopen 函数简介 dlo ...

  5. SQLMAP数据库注入工具下载安装

    介绍 Sqlmap 是一个自动化的 SQL 注入工具,其主要功能是扫描.发现并利用给定的 Url 的 Sql 注入漏洞,目前支持 MySQL. Oracle. PostgreSQL. Microsof ...

  6. mysql sql注入工具_SQL注入工具实践

    程序简介 超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具,支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入. ...

  7. 一个不错的Windows全平台DLL注入工具

    一个不错的Windows全平台DLL注入工具 支持WinXP-Win10 最高级权限注入,做想做和要做的事都无任何障碍 LdrLoadDll方式注入绝对稳定可靠 单文件,无任何依赖 支持32位和64位 ...

  8. Wifitap是一个WiFi注入工具集常用命令集合大学霸IT达人

    Wifitap是一个WiFi注入工具集常用命令集合大学霸IT达人 该工具集允许任何应用程序都可以发送和接收IP数据包,使用802.11流量捕获和注入,并通过WiFi网络简单配置接口wj0.Wifita ...

  9. 多协议注入工具t50

    多协议注入工具t50 t50是Kali Linux自带的一款网络数据包注入工具.该工具支持15种协议,不仅涵盖常规协议(ICMP.TCP.UDP),还涵盖基础协议和路由协议(GRE.IPSec.RSV ...

  10. 网络数据注入工具HexInject

    网络数据注入工具HexInject 对于Kali Linux提供的工具HexInject来说,数据注入才是其最重要的功能.它可以直接向网络注入渗透人员构造的数据包,也可以篡改网络传输的数据.为了避免修 ...

最新文章

  1. Git 分支 - 分支的新建与合并
  2. 设计模式之【外观模式-Facade】
  3. JDK 动态代理和MyBatis 用到的JDK 动态代理有什么区别?
  4. Java Date Nuances的痛苦提醒
  5. 复数正弦波 matlab,为什么正弦,反正弦函数计算结果会出现复数?
  6. [转载] python+selenium定时爬取丁香园的新冠病毒每天的数据,并制作出类似的地图(部署到云服务器)
  7. The beginning iOS8 Programming with Swift 中文翻译 - 3
  8. 计算机输入法切换用户登录,电脑切换不出来输入法,教您解决切换输入法的问题...
  9. 计算机组装有哪些,详解电脑组装配置有哪些
  10. 【考试总结】[CQOI2017]考试总结
  11. gdc函数(最大公约数)
  12. 程序启动,遇到Process finished with exit code 1 解决方法
  13. 二维码活码源码(含数据库脚本)
  14. 智能优化及其应用——课程设计(粒子群算法)
  15. 首发 | 杭派工程师五年生存现状报告
  16. AAAI2020 A pre-training based personalized dialogue generation model with persona-sparse data
  17. Cocos2d-JS开发中的一些小技巧(持续更新)
  18. MP2451的BUCK电路
  19. Discuz!更换论坛系统默认头像方法
  20. 针对应用程序的专为Windows XP设计徽标

热门文章

  1. 电子智能化专包有哪些要求和标准
  2. Dynamic Web TWAIN:网页扫描过程中如何自动检测和删除空白页?
  3. matlab 超像素合并,超像素区域合并
  4. 超像素池化全监督语义分割
  5. lisp角度转换弪度_角度与弧度之间的换算(rad与度的换算)
  6. Cookie与Session基本使用
  7. 微信小程序自定义下拉刷新
  8. 矩阵乘法,输出结果矩阵
  9. k2p php服务器,网件R6800与斐讯K2P之间的mu-mimo测试
  10. 光有想法怎么开技术公司?