在Dictionary C中使用泛型类#

时间:2014-05-14 15:06:35

标签: c# generics collections

我需要实现一个应该包含SpecCollectionKEY的集合(例如VALUE)。密钥应该是复合密钥。请参阅简短的实施:

public class CompositeKey<TId, TName>
{
    private TId _id;
    private TName _name;

    public TId Id { get; set; }
    public TName Name { get; set; }
}

我应该只通过以下方式初始化我的馆藏:

SpecialCollection<CompositeKey<string, int>, DateTime> e = new 
    SpecialCollection<CompositeKey<string, int>, DateTime>();

或者像这样:

SpecialCollection<CompositeKey<DateTime, int>, SomeClass> e = new 
    SpecialCollection<CompositeKey<DateTime, int>, SomeClass>();

如果有可能,请告诉我如何申报我的收藏?

我找到了以下方法:

public class SpecialCollection<TId, TName, TValue> 
    : Dictionary<CompositeKey<TId, TName>, TValue> 
{
    private Dictionary<CompositeKey<TId, TName>, TValue> _baseDictionary = new 
        Dictionary<CompositeKey<TId, TName>, TValue>();
}

但在这种情况下,我只能像这样初始化集合对象:

SpecialCollection<DateTime, int, string> col = 
    new SpecialCollection<DateTime, int, string>();

您对如何声明该集合有任何想法吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

没有办法完全按照自己的意愿行事 - .NET编译器无法部分直观地输入泛型类型参数。这给你留下了三个选择。

  1. 什么都不做。你现在使用它的方式是实现这样的标准方法。您可以自动获得所需的密钥类型(CompositeKey<Tid, TName>)。

  2. 放弃CompositeKey<> 的类型。在这种情况下,您接受任何CompositeKey作为TKey值。为此,您需要CompositeKey的非通用基类或ICompositeKey接口。您将无法访问Tid和TName inside SpecialCollectioN&lt;&gt;`的类型,因为您没有指定它可以使用的任何类型。

    public class SpecialCollection<TKey, TValue> 
        : Dictionary<TKey, TValue> where TKey : CompositeKey
    {
        private Dictionary<TKey, TValue> _baseDictionary = new 
            Dictionary<TKey, TValue>();
    }
    
  3. 指定四个类型参数。这样,您强制第一个类型为CompositeKey<Tid, TName>SpecialCollection<>会知道它的类型。另一方面,您必须指定所有四个,因为C#不能进行部分泛型类型推断。 (即它全部或全部)。请注意,您可以将订单更改为对您最有意义的任何内容。

    public class SpecialCollection<TKey, TValue, Tid, TName> 
        : Dictionary<TKey, TValue> where TKey : CompositeKey<Tid, TName>
    {
        private Dictionary<TKey, TValue> _baseDictionary = new 
            Dictionary<TKey, TValue>();
    }
    

答案 1 :(得分:1)

也许你正在寻找这样的东西:

public class SpecialCollection<TKey, TValue> : Dictionary<TKey, TValue>
    where TKey : CompositKey
{
}

public abstract class CompositeKey
{
    protected CompositeKey(object id, object name)
    {
        Id = id;
        Name = name;
    }

    public object Id { get; private set; }

    public object Name { get; private set; }
}

public class CompositeKey<TId, TName> : CompositeKey
{
    public CompositeKey(TId id, TName name)
        : base(id, name) { }

    public new TId Id
    {
        get { return (TId)base.Id; }
    }

    public new TName Name
    {
        get { return (TName)base.Name; }
    }
}

抽象的非通用CompositeKey课程授予您对Id课程中NameSpecialCollection媒体资源的有限访问权限。

但我认为你应该考虑你的第一个想法,因为那样你就可以在IdName上获得类型安全。

相关问题