我需要实现一个应该包含SpecCollection
和KEY
的集合(例如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>();
您对如何声明该集合有任何想法吗?
谢谢!
答案 0 :(得分:4)
没有办法完全按照自己的意愿行事 - .NET编译器无法部分直观地输入泛型类型参数。这给你留下了三个选择。
什么都不做。你现在使用它的方式是实现这样的标准方法。您可以自动获得所需的密钥类型(CompositeKey<Tid, TName>
)。
放弃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>();
}
指定四个类型参数。这样,您强制第一个类型为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
课程中Name
和SpecialCollection
媒体资源的有限访问权限。
但我认为你应该考虑你的第一个想法,因为那样你就可以在Id
和Name
上获得类型安全。