Skip to main content
 首页 » 编程设计

c#之通用集合类

2024年02月03日23EasonJim

无论如何我可以做到这一点吗?

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

它不喜欢我对 collection 的定义.我希望定义看起来像 TSOC<TCollection>用户可以在这里传入 List<int>或其他东西,但随后我需要提取“int”以了解要实现的接口(interface)。


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

请您参考如下方法:

怎么样:

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> 的实际底层类型。 .


更新:

现在回应这个编辑:

Basically I just wanted to wrap all the ICollection methods in locks and force them to run on a particular thread, but still keep all the additional functionality of the programmer's collection of choice.... I'm not sure this is possible though

我认为您实际上可以实现您想要的,但方式可能与您预期的略有不同。你甚至不需要集合,你只需要一个同步包装器:

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 等库进行方法拦截。