通用集合类?

时间:2010-05-08 23:03:51

标签: c# generics class syntax

无论如何我能做到吗?

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

它不喜欢我对collection的定义。我更喜欢这个定义看起来像TSOC<TCollection>,用户可以在其中传递List<int>或其他内容,但是我需要提取“int”以了解要实现的接口。


基本上我只想在ICollection中包装所有locks方法并强制它们在特定线程上运行,但仍保留程序员选择集合的所有附加功能....我不确定这是否可行。

2 个答案:

答案 0 :(得分: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>同时添加线程安全性,那么你实际需要的是使用像Castle DynamicProxy这样的库进行方法拦截。 / p>

答案 1 :(得分:1)

如果您的类的使用者传入集合的isntance,您可能不需要将其指定为类的通用定义的一部分。

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

    private ICollection<T> _collection;
}

您需要一个实现ICollection<T>的对象来构造类型,但您不需要告诉它该集合的显式类型。

这会对你有用吗?