1、手写Unity容器--极致简陋版Unity容器
2024-10-18 11:50:35
模拟Unity容器实例化AndroidPhone
一、条件
1、容器--工厂
2、集合
3、反射
4、特性--相当于配置
二、思路
1、注册类型:把类型完整名称作为key添加到数据字典中,类型添加到数据字典的value中
2、获取实例:根据完整类型名称也就是key取出value,用反射创建类型的实例
三、代码实现
1、IPhone接口
namespace SimplestUnity
{
interface IPhone
{
void Call();
}
}
2、AndroidPhone实现
namespace SimplestUnity
{
public class AndroidPhone:IPhone
{
public AndroidPhone()
{
Console.WriteLine("{0}构造函数", this.GetType().Name);
} public void Call()
{
Console.WriteLine("{0}打电话", this.GetType().Name);
}
}
}
3、容器--接口
namespace SimplestUnity
{
public interface IDaivdContainer
{
void RegisterType<TFrom, TTo>(); T Resolve<T>();
}
}
4、容器--实现
namespace SimplestUnity
{
public class DaivdContainer:IDaivdContainer
{
private Dictionary<string, Type> containerDictionary = new Dictionary<string, Type>();//字典 public void RegisterType<TFrom, TTo>()
{
containerDictionary.Add(typeof(TFrom).FullName, typeof(TTo));
} public T Resolve<T>()
{
Type type = containerDictionary[typeof(T).FullName];
return (T)Activator.CreateInstance(type);
}
}
}
5、客户端调用
class Program
{
static void Main(string[] args)
{
DaivdContainer davidContainer = new DaivdContainer();
davidContainer.RegisterType<IPhone, AndroidPhone>();
IPhone iphone = davidContainer.Resolve<IPhone>();
iphone.Call();
}
}
6、运行效果
最新文章
- const 和 readonly
- php中or的含义
- 边工作边刷题:70天一遍leetcode: day 86-2
- C# Winform 拖放操作
- Requirements of children
- mysql中的timestamp类型时间比较:unix_timestamp函数
- Spring Boot 入门
- iOS根据2个经纬度计算距离
- uva11922(强行用rope替代spaly)
- java流的性能优化1-文件复制
- haxe 嵌入swf 读取里面的内容
- VS 2017 Git failed with a fatal error的解决办法
- 第3阶段——内核启动分析之make menuconfig内核配置(2)
- JavaEE error整理(不断更新)
- Python就业指导
- (最简单)红米手机5A的USB调试模式在哪里开启的方法
- Linux中对逻辑卷的移除
- oracle 游标/函数/存储过程/触发器 表空间
- PAT 乙级 1066. 图像过滤(15)
- android 系统层 常用类介绍