如何:
class TSOC<TCollection, TValue> : ICollection<TValue>, INotifyCollectionChanged
where TCollection : ICollection<TValue>
{
private TCollection collection;
}
我认为这是你在找什么。看起来也许你试图包装一个泛型集合,并且你希望第一种类型的参数是同一类型的现有集合。这会给你完全的。
很难说,但你可能甚至不需要。除非你真的需要知道的基本类型TCollection
的对象,你很可能只是让它TSOC<TValue>
并接受ICollection<TValue>
与把它包起来:
class TSOC<TValue> : ICollection<TValue>, INotifyCollectionChanged
{
private ICollection<TValue> collection;
}
这在功能上同样的事情,你就不会了解ICollection<TValue>
的实际潜在类型。
更新:
现在有感于此编辑:
基本上我只是想换行所有ICollection的方法锁,并强迫他们在一个特定的线程上运行,但仍然保持程序员的选择集合的所有附加功能....我不确定这是可能的,虽然
我想你其实可能达到你想要的,但也许以一种比你期望的稍微不同的方式。你甚至不真正需要收集,你只想要一个同步包装:
public class Synchronized<T>
{
private readonly object sync = new Object();
private T item;
public Synchronized(T item)
{
this.item = item;
}
public void Execute(Action<T> action)
{
lock (sync)
action(item);
}
public TResult Evaluate<TResult>(Func<T, TResult> selector)
{
lock (sync)
return selector(item);
}
}
然后用它作为:
var sc = new Synchronized<ICollection<int>>(new List<int>());
sc.Execute(c => c.Add(3));
int count = sc.Evaluate(c => c.Count);
现在我知道这是不是正是你想要的,因为它实际上并没有给你一个你可以传递的ICollection<T>
的实例。但它是对锁定行为的干净封装并隐藏了内部集合,因此您可以保证每个操作都是“线程安全的”。
如果你真的需要的ICollection<T>
等效实例包装另一个ICollection<T>
同时加入线程安全的,那么你实际上寻找的是使用像城堡DynamicProxy库法拦截。
其实我不认为我完全想到这一点。他们的想法是,如果他们需要他们的集合具有某些属性,他们可以传入'SortedList'或'Queue'或你有什么,但我只是意识到他们不会访问任何其他方法无论如何,这些集合......所以你的任何解决方案可能会正常工作。除非我可以从TCollection继承,否则我认为我的课会毫无意义:\ – mpen 2010-05-08 23:36:14
W /您的第二个sol'n ...您不能实例化一个ICollection ...但是,我可以强制程序员通过正如马特指出的那样,我认为这是一个收藏品。 – mpen 2010-05-08 23:48:34
不错的更新!我不认为我现在想要走这两条路线,尽管......我只会写一些符合我现在需要的定制集合:) – mpen 2010-05-09 00:22:52