Unity默认提供了三种拦截器:TransparentProxyInterceptor、InterfaceInterceptor、VirtualMethodInterceptor。

TransparentProxyInterceptor:代理实现基于.NET Remoting技术,它可拦截对象的所有函数。缺点是被拦截类型必须派生于MarshalByRefObject。示例如下:

 1 public class MyObject : MarshalByRefObject
 2 {
 3   public String Name { get; set; }
 4 }
 5
 6 IUnityContainer unityContainer = new UnityContainer();
 7
 8 unityContainer.AddNewExtension<Interception>();
 9 unityContainer.RegisterType<MyObject>(new Interceptor<TransparentProxyInterceptor>(), new InterceptionBehavior(new NotifyPropertyChangedBehavior()));
10
11 MyObject myObject = unityContainer.Resolve<MyObject>();
12
13 ((INotifyPropertyChanged)myObject).PropertyChanged += new PropertyChangedEventHandler((sender, e) => Console.WriteLine(e.PropertyName));
14
15 myObject.Name = “hello, world”;

InterfaceInterceptor:只能对一个接口做拦截,好处时只要目标类型实现了指定接口就可以拦截。示例如下:

 1 public class MyObject2 : IServiceProvider
 2 {
 3
 4   #region IServiceProvider Members
 5
 6   public object GetService(Type serviceType)
 7   {
 8     return null;
 9   }
10
11   #endregion
12 }
13
14 public sealed class MyInterceptionBehavior : IInterceptionBehavior
15 {
16   #region IInterceptionBehavior Members
17
18   public Boolean WillExecute
19   {
20     get { return true; }
21   }
22
23   public IEnumerable<Type> GetRequiredInterfaces()
24   {
25     return new Type[0];
26   }
27
28   public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
29   {
30     return getNext()(input, getNext);
31   }
32
33   #endregion
34 }
35
36 IUnityContainer unityContainer = new UnityContainer();
37
38 unityContainer.AddNewExtension<Interception>();
39 unityContainer.RegisterType<IServiceProvider, MyObject2>(“MyObject2″,
40   new Interceptor<InterfaceInterceptor>(),
41   new InterceptionBehavior<MyInterceptionBehavior>()
42 );
43
44 IServiceProvider myObject = unityContainer.Resolve<IServiceProvider>(“MyObject2″);
45
46 myObject.GetService(typeof(MyObject2));

注册类型时需要显示指定被拦截接口类型。

VirtualMethodInterceptor:对virtual函数进行拦截。缺点是如果被拦截类型没有virtual函数则无法拦截,这个时候如果类型实现了某个特定接口可以改用InterfaceInterceptor。看一个简单示例:

 1 public class MyObject3
 2 {
 3   public virtual void DoWork()
 4   {
 5
 6   }
 7 }
 8
 9 IUnityContainer unityContainer = new UnityContainer();
10
11 unityContainer.AddNewExtension<Interception>();
12 unityContainer.RegisterType<MyObject3>(
13   new Interceptor<VirtualMethodInterceptor>(),
14   new InterceptionBehavior<MyInterceptionBehavior>()
15 );
16
17 MyObject3 myObject = unityContainer.Resolve<MyObject3>();
18
19 myObject.DoWork();

Unity的三种Interceptor相关推荐

  1. Unity打字机 三种方式教会你

    Unity打字机教程 预读 成品 第一步 创建UGUI布局 并 修改自适应 第二步 添加文本框 第三步 写代码 之第一种:常规写法 之第二种:协程+for循环 之第三种:while循环 + 协程 挂载 ...

  2. Unity中的三种资源加载和卸载

    前言 内容转载自: https://www.cnblogs.com/zhoujiangyue/articles/7066070.html. Unity中三种资源加载方式: 1.静态引用.具体操作:创建 ...

  3. 盛大游戏技术总监徐峥:Unity引擎使用的三种方式

    在5月13日Unite 2017 案例分享专场上,盛大游戏技术总监徐峥分享了使用Unity引擎的三种方式,以下为详细内容: 大家好,我先简单介绍一下我自己,我是盛大游戏的技术总监徐峥.我今天想分享的主 ...

  4. unity中控制游戏物体移动最基本的三种方法

    **unity**中控制游戏物体移动的最基本的三种方法 第一种移动方法-transform.Translate,游戏物体按照你给的方向和速度进行运动 代码如下: Public float speed; ...

  5. Unity fog雾的三种模式

    unity fog雾的三种模式 1.Linear 线性模式,有fogStartDistance和fogEndDistance两个参数,雾从Start开始到End越来越浓,End之后也为最大浓度,计算方 ...

  6. 【100个 Unity小知识点】 | 启动unity应用时的 Unity Logo 删除/替换的三种方案

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  7. Unity烘培的简单使用 三种烘焙模式的介绍

    Unity烘培的三种模式使用介绍 需要了解的知识 简介 Unity烘培是什么 间接光源和直接光源 Mixed 和 Baked 灯光设置的区别 Unity烘培在什么情况下使用 最常用的烘焙设置 Unit ...

  8. Unity三种物体溶解方法

    Unity三种物体溶解方法 @[TOC](Unity三种物体溶解方法 效果展示 1. 利用Noise纹理进行溶解 shader要点 shader代码 2. 屏幕空间棋盘格 shader要点 shade ...

  9. 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

最新文章

  1. apache虚拟机的开启iis apache共存 apache 的设置(报错 找不到 Not found)
  2. Linux如何编译安装源码包软件
  3. 通过SolrJ 4.9管理Solr core
  4. JZOJ__Day 4:【普及模拟】游戏
  5. va_list/va_start/va_arg/va_end深入分析
  6. unity三维地图的经纬度如何在二维地图上表示_接入C++版本recastnavigation寻路库到Unity/服务端中...
  7. HTML学习(2)(摘抄自慕课)
  8. 【Elasticsearch】搜索基准测试:RediSearch 与 Elasticsearch
  9. php创建游戏房间思路,php设计模式之建造器模式分析【星际争霸游戏案例】
  10. H264--H264编码--4
  11. 机器学习笔记(二十二):逻辑回归中使用模型正则化
  12. Mac 创建.txt文件
  13. matlab 不等式约束,MATLAB进行fmincon函数优化时非线性不等式约束总是报错
  14. CSDN 空间:“迷你博客”很迷人(1)
  15. html点击出现对勾,css伪类 右下角点击出现 对号角标表示选中的示例代码
  16. 德州停电悲剧不会重演 智慧用电是新方向
  17. Python Pcan USB通信(基于PcanBus)
  18. 用python 编写一个简单的游戏
  19. 编辑器vi使用方法详细介绍
  20. 工具系列 | 使用Lodop进行WEB打印程序开发

热门文章

  1. OpenWebSpider 安装使用
  2. iOS开发-由浅至深学习block
  3. animate默认时长所带来的问题及解决
  4. 用WinForm/WPF代码来为.NET Core 3.0功能投票
  5. 入门系列之使用fail2ban防御SSH服务器的暴力破解攻击
  6. 沃尔沃加入英伟达阵营 2021年开卖自动驾驶汽车
  7. 设计模式——6适配器模式(Adapter)
  8. 获取 metadata 的完整例子 - 每天5分钟玩转 OpenStack(166)
  9. 美团App首页实现之Category_HeaderView可翻页实现
  10. Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6