如何基于特定于具体类的谓词从接口集合中检索对象?

时间:2019-04-29 00:56:01

标签: c#

我在实现IFoo的类中有一个对象集合作为属性。我想添加一种方法,用于按类型和谓词(特定于具体实现)从集合中检索项目。我的问题是我无法从接口定义的集合中向下转换到我的具体类(无法从用法推断类型),像这样:

public HashSet<IFoo> Foos { get; } = new HashSet<IFoo>();

public T GetFoo<T>(Func<T, bool> predicate) where T : class
    {
        if (Foos != null && predicate != null)
        {
            var foos = Foos.Where(f => f is T);
            return foo = foos.FirstOrDefault(predicate);
        }

        return null;
    }

我该怎么做?

2 个答案:

答案 0 :(得分:2)

由于您的HashSet的类型为IFoo,因此您的谓词也应使用IFoo。完成此操作的最简单方法是更改​​方法的签名:

    public IFoo GetFoo<T>(Func<IFoo, bool> predicate) where T: IFoo, class

答案 1 :(得分:0)

找到了解决方案。我正在谓词和我实际使用的其他地方中检索IFoo并进行向下转换,但在检索时不这样做:

 public IFoo GetFoo<T>(Func<IFoo, bool> predicate) where T : class
    {
        if (Foos != null && predicate != null)
        {
            var foos = Foos.Where(f => f is T);
            return foos.FirstOrDefault(predicate);
        }

        return null;
    }