无论如何我可以做到这一点吗?
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 等库进行方法拦截。
