无论如何我能做到吗?
class TSOC<TCollection, TValue> : ICollection<TValue>, INotifyCollectionChanged where TCollection : ICollection
{
private TCollection<TValue> collection;
}
它不喜欢我对collection
的定义。我更喜欢这个定义看起来像TSOC<TCollection>
,用户可以在其中传递List<int>
或其他内容,但是我需要提取“int”以了解要实现的接口。
基本上我只想在ICollection
中包装所有locks
方法并强制它们在特定线程上运行,但仍保留程序员选择集合的所有附加功能....我不确定这是否可行。
答案 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>
的对象来构造类型,但您不需要告诉它该集合的显式类型。
这会对你有用吗?