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