gpt4 book ai didi

c# - 通用集合类?

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:50 26 4
gpt4 key购买 nike

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

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

关于c# - 通用集合类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2795977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com