You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现按接口类型添加与获取对象的功能?

实现方案

核心思路是用类型字典按接口类型分组存储对象,每个接口类型对应一个实例列表。具体实现如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:41:10