2010-05-08 51 views
1

无论如何我可以做到这一点吗?通用集合类?

class TSOC<TCollection, TValue> : ICollection<TValue>, INotifyCollectionChanged where TCollection : ICollection 
{ 
    private TCollection<TValue> collection; 
} 

它不喜欢我的定义collection。我希望定义看起来像TSOC<TCollection>,其中用户可以通过List<int>什么的,但是然后我需要拔出“int”来知道要实现什么接口。


基本上我只是想所有的ICollection方法包裹在locks,并强迫他们在一个特定的线程上运行,但仍保留选择的程序员的集合中的所有附加功能....我不是当然,这是可能的。

回答

4

如何:

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库法拦截。

+0

其实我不认为我完全想到这一点。他们的想法是,如果他们需要他们的集合具有某些属性,他们可以传入'SortedList'或'Queue'或你有什么,但我只是意识到他们不会访问任何其他方法无论如何,这些集合......所以你的任何解决方案可能会正常工作。除非我可以从TCollection继承,否则我认为我的课会毫无意义:\ – mpen 2010-05-08 23:36:14

+0

W /您的第二个sol'n ...您不能实例化一个ICollection ...但是,我可以强制程序员通过正如马特指出的那样,我认为这是一个收藏品。 – mpen 2010-05-08 23:48:34

+0

不错的更新!我不认为我现在想要走这两条路线,尽管......我只会写一些符合我现在需要的定制集合:) – mpen 2010-05-09 00:22:52

1

如果您的类的消费者正在传递集合的实例,那么您可能不需要将其指定为类的通用定义的一部分。

public class TSCO<T> : ICollection<T>, INotifyCollectionChanged 
{ 
    public TSCO(ICollection<T> collection) 
    { 
     _collection = collection; 
    } 

    private ICollection<T> _collection; 
} 

你需要实现ICollection<T>构造类型的对象,但你并不需要告诉它该集合是什么类型的明确。

这样可以吗?