C# 注入工具方式[Inject]
引言
使用[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]相关推荐
- 命令注入工具Commix
命令注入工具Commix 命令注入(Command Injection)攻击是针对Web应用的一种攻击方式.很多Web应用会读取用户提交的数据,然后传递到系统Shell,执行特定的操作,如为用户创建单 ...
- 【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★
文章目录 一.Android 进程注入工具开发系列博客 二.Android 进程注入工具 源码下载编译 三.逆向环境搭建 四.使用注入工具进行逆向操作 1.获取远程进程号 2.注入工具准备 3.注入动 ...
- 【Android 逆向】Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )
文章目录 前言 一.Android 进程读取文件所需的权限 二.fopen 打开文件标志位 三.验证文件权限 前言 一.Android 进程读取文件所需的权限 通过 注入工具 , 将 libbridg ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )
文章目录 一.dlopen 函数简介 二.获取 目标进程 linker 中的 dlopen 函数地址 三.远程调用 目标进程 linker 中的 dlopen 函数 一.dlopen 函数简介 dlo ...
- SQLMAP数据库注入工具下载安装
介绍 Sqlmap 是一个自动化的 SQL 注入工具,其主要功能是扫描.发现并利用给定的 Url 的 Sql 注入漏洞,目前支持 MySQL. Oracle. PostgreSQL. Microsof ...
- mysql sql注入工具_SQL注入工具实践
程序简介 超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具,支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入. ...
- 一个不错的Windows全平台DLL注入工具
一个不错的Windows全平台DLL注入工具 支持WinXP-Win10 最高级权限注入,做想做和要做的事都无任何障碍 LdrLoadDll方式注入绝对稳定可靠 单文件,无任何依赖 支持32位和64位 ...
- Wifitap是一个WiFi注入工具集常用命令集合大学霸IT达人
Wifitap是一个WiFi注入工具集常用命令集合大学霸IT达人 该工具集允许任何应用程序都可以发送和接收IP数据包,使用802.11流量捕获和注入,并通过WiFi网络简单配置接口wj0.Wifita ...
- 多协议注入工具t50
多协议注入工具t50 t50是Kali Linux自带的一款网络数据包注入工具.该工具支持15种协议,不仅涵盖常规协议(ICMP.TCP.UDP),还涵盖基础协议和路由协议(GRE.IPSec.RSV ...
- 网络数据注入工具HexInject
网络数据注入工具HexInject 对于Kali Linux提供的工具HexInject来说,数据注入才是其最重要的功能.它可以直接向网络注入渗透人员构造的数据包,也可以篡改网络传输的数据.为了避免修 ...
最新文章
- DDos游戏行业受攻击最多
- agc015F Kenus the Ancient Greek
- Hive _偏门常用查询函数(二)附带实例(列转行、窗口函数)
- SAP UI5 标准应用的多语言支持 - SAP UI5 运行时语言判定机制
- Spring定时器的运用
- 构建linux内核源码树
- SQL事务与ADO.NET事务
- 三菱plc软件测试程序com端口,三菱plc编程软件com端口不能保存
- linux下安装交叉编译器
- 咬了一口苹果死去的计算机之父——图灵
- 双稳态继电器工作原理图_常见的继电器及工作原理
- 论文记录-2018-A survey on image tampering and its detection in real-world photos
- 入侵网页html服务器,Web渗透入侵思路(脑图)| 内附彩蛋
- 555定时器基本原理
- spring boot 配置文件properties,yml语法学习及属性获取@ConfigurationProperties和@Value
- PostgreSQL数据库部署之 :PostgreSQL pgadmin4 the application server could not be contacted
- html复习第四课(2_34_0924_html)
- 冯诺依曼与哈佛结构的区别
- 华为机试【连续出牌数量】
- 他是硅谷最好斗的华人 微软、谷歌、特斯拉都离不开他
热门文章
- 亿航白鹭落户西安建丝路总部,为“硬科技之都”插上双翼
- GIS要学哪种计算机语言,做好一名ArcGIS开发人员所需要掌握的知识
- 【广东大学生网络攻防大赛-WriteUp(非官方)】Reverse | pyre
- 系统分析师知识点汇总
- python读取xml文件并修改_如何在Python中解析和修改XML?
- arcgis重心迁移分析_ArcGIS支持下三峡库区适度人口重心迁移研究
- 百度富文本编辑器UEditor增加自定义字体
- 唯品会等被纳入MSCI指数,中概股迎来春天
- md5算法不可逆,为啥网上很多网站声称可以解密md5
- ASP.net校友录毕业设计(源代码+论文+开题报告+答辩PPT)ASP.NET小型证券术语解释及翻译系统的设计与开发(源代码+论文)