代码之家  ›  专栏  ›  技术社区  ›  mpen

通用集合类?

  •  1
  • mpen  · 技术社区  · 15 年前

    我能做这个吗?

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

    它不喜欢我的定义 collection . 我希望这个定义看起来像 TSOC<TCollection> 用户可以通过的地方 List<int> 或者别的什么,但是我需要拉出“int”来知道要实现什么接口。


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

    2 回复  |  直到 15 年前
        1
  •  4
  •   Aaronaught    15 年前

    怎么样:

    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<t值>


    更新:

    立即响应此编辑:

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

    我想你真的 能够 实现你想要的,但也许用的方式与你期望的略有不同。你甚至不需要收集,你只需要一个同步包装:

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

        2
  •  1
  •   Matt Hamilton    15 年前

    如果类的使用者传入集合的IsContance,则可能不需要将其指定为类的泛型定义的一部分。

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

    您需要一个实现 ICollection<T> 构造类型,但不需要明确告诉它集合是什么类型。

    那对你有用吗?