引言

使用[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. DDos游戏行业受攻击最多
  2. agc015F Kenus the Ancient Greek
  3. Hive _偏门常用查询函数(二)附带实例(列转行、窗口函数)
  4. SAP UI5 标准应用的多语言支持 - SAP UI5 运行时语言判定机制
  5. Spring定时器的运用
  6. 构建linux内核源码树
  7. SQL事务与ADO.NET事务
  8. 三菱plc软件测试程序com端口,三菱plc编程软件com端口不能保存
  9. linux下安装交叉编译器
  10. 咬了一口苹果死去的计算机之父——图灵
  11. 双稳态继电器工作原理图_常见的继电器及工作原理
  12. 论文记录-2018-A survey on image tampering and its detection in real-world photos
  13. 入侵网页html服务器,Web渗透入侵思路(脑图)| 内附彩蛋
  14. 555定时器基本原理
  15. spring boot 配置文件properties,yml语法学习及属性获取@ConfigurationProperties和@Value
  16. PostgreSQL数据库部署之 :PostgreSQL pgadmin4 the application server could not be contacted
  17. html复习第四课(2_34_0924_html)
  18. 冯诺依曼与哈佛结构的区别
  19. 华为机试【连续出牌数量】
  20. 他是硅谷最好斗的华人 微软、谷歌、特斯拉都离不开他

热门文章

  1. 亿航白鹭落户西安建丝路总部,为“硬科技之都”插上双翼
  2. GIS要学哪种计算机语言,做好一名ArcGIS开发人员所需要掌握的知识
  3. 【广东大学生网络攻防大赛-WriteUp(非官方)】Reverse | pyre
  4. 系统分析师知识点汇总
  5. python读取xml文件并修改_如何在Python中解析和修改XML?
  6. arcgis重心迁移分析_ArcGIS支持下三峡库区适度人口重心迁移研究
  7. 百度富文本编辑器UEditor增加自定义字体
  8. 唯品会等被纳入MSCI指数,中概股迎来春天
  9. md5算法不可逆,为啥网上很多网站声称可以解密md5
  10. ASP.net校友录毕业设计(源代码+论文+开题报告+答辩PPT)ASP.NET小型证券术语解释及翻译系统的设计与开发(源代码+论文)