如何实现按接口类型添加与获取对象的功能?
实现方案
核心思路是用类型字典按接口类型分组存储对象,每个接口类型对应一个实例列表。具体实现如下:
1. 定义核心存储结构
在负责管理对象的类中,声明一个私有字典用于映射接口类型到对应实例集合:
private readonly Dictionary<Type, List<object>> _interfaceInstanceMap = new Dictionary<Type, List<object>>();
2. 实现AddObjectThatImplements<T>方法
该方法会将传入对象添加到它所实现的所有相关接口的列表中(包括继承链上的接口,比如实现I1的对象也会被加入I0的列表):
public void AddObjectThatImplements<T>(T o) where T : I0 { if (o == null) throw new ArgumentNullException(nameof(o)); // 获取对象实现的所有I0派生接口 var implementedInterfaces = o.GetType().GetInterfaces() .Where(t => typeof(I0).IsAssignableFrom(t)); // 加入传入的T类型本身,避免遗漏用户指定的类型 var targetTypes = implementedInterfaces.Append(typeof(T)).Distinct(); foreach (var type in targetTypes) { if (!_interfaceInstanceMap.TryGetValue(type, out var instances)) { instances = new List<object>(); _interfaceInstanceMap[type] = instances; } // 避免重复添加同一对象 if (!instances.Contains(o)) { instances.Add(o); } } }
3. 实现GetInterfaces<T>方法
根据指定接口类型T,从字典中取出对应实例并转换为List<T>返回:
public List<T> GetInterfaces<T>() where T : I0 { var targetType = typeof(T); if (_interfaceInstanceMap.TryGetValue(targetType, out var instances)) { return instances.Cast<T>().ToList(); } return new List<T>(); }
4. 对象初始化时的调用
在A、B、C等对象的构造方法中,直接调用存储类的AddObjectThatImplements方法即可完成注册:
public class A : I1, I2 { public A(YourStorageClass storage) { // 可选择注册单个接口,或直接注册基础接口I0以覆盖所有实现的接口 storage.AddObjectThatImplements<I1>(this); // storage.AddObjectThatImplements<I0>(this); } }
注意事项
- 泛型约束
where T : I0确保传入类型均基于基础接口I0,避免无效类型传入。 - 添加逻辑包含重复检查,防止同一对象被多次加入同一接口列表。
- 若需支持泛型接口,可扩展类型匹配逻辑(例如通过
typeof(IGeneric<>).MakeGenericType(...)处理泛型类型)。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

