按类型添加和获取列表中的对象

问题描述 投票:0回答:1

假设我有一堆对象 A, B, C, ... 实现多个接口 I1, I2, I3, ...

我的目标是拥有这样的功能

public void AddObjectThatImplements<T>(object o){
    //add o to some data structure that stores objects that implement T
}

public List<T> GetInterfaces<T>(){
    //return all T instances from the list of who implements T
}

在每个对象的初始化方法中,我可以将它们的接口添加到任何类型的数据结构中,以帮助使这些功能正常工作。

为了简单起见,所有接口 I1、I2... 都继承自基接口 I0。

如何构建这样的功能?欢迎任何额外的数据结构。

c# generics interface
1个回答
0
投票

您可以将所有对象存储在

List<object>
中。
然后在
GetInterfaces
中使用 is 运算符,构建第一个中所有
is T
对象的新列表。

根据文档,is 运算符 为 True,特别是在以下情况下:

  • 表达式结果的运行时类型是T。
  • 表达式结果的运行时类型派生自类型 T、实现接口 T 或其他隐式引用转换 从它到 T 存在。

我知道它忽略了

T
中的
AddObjectThatImplements
,但它似乎实现了您需要的行为。
因此,在下面的示例中,我将
AddObjectThatImplements
重命名为
AddObject

public class Example
{
    private List<object> all_objects = new List<object>();

    public void AddObject(object o)
    {
        all_objects.Add(o);
    }

    public List<T> GetInterfaces<T>()
    {
        List<T> list = new List<T>();
        foreach(object o in all_objects)
        {
            if (o is T)
            {
                list.Add((T)o);
            }
        }
        return list;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.