0

好的。

我有一个 MyClass 类和另一个基于 List 的类。我们称它为 MyCollection。

现在当有人输入:

MyCollection coll = new MyCollection();
...
coll.Find(...)

他们作用于整个系列。我想在幕后应用一些过滤,这样如果他们编写上面的代码,实际执行的是......

coll.Where(x=>x.CanSeeThis).Find(...)

我需要在 MyCollection 类的定义中写什么才能使其工作?

我可以做这个工作吗?

4

2 回答 2

3

您可能想编写一个实现IListor的包装类,在内部ICollection使用常规List。然后,此包装类将所有方法调用代理到内部列表,并根据需要应用过滤器。

于 2011-01-25T11:51:08.067 回答
1

你已经提到你有自己的收藏,可能来自 List 对吧?然后您需要创建自己的查找方法:

public class MyList<T> : System.Collections.Generic.List<T>
{
  public IEnumerable<T> MyFind(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }
}

不幸的是,这是必需的,因为您不能直接覆盖 List 上的 Find 方法。但是,您可以使用“new”关键字来指定如果您有对 MyList 实例的引用,它将使用 find 的实现,如下所示:

  public new IEnumerable<T> Find(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }

但是,上面的示例将产生:

MyCollection<int> collection = new ...
collection.Find(myPredicate); // <= Will use YOUR Find-method

List<int> baseTypeCollection = collection; // The above instantiated
baseTypeCollection.Find(myPredicate); // Will use List<T>.Find!

所以最好是你自己的方法。

于 2011-01-25T11:59:42.310 回答