【发布时间】:2015-06-05 10:58:30
【问题描述】:
我想要一个键值对集合类,其中不知道实例化级别的键类型,但只知道向集合添加新元素时的值类型。
考虑下面的代码sn-p
public class Collection<TKey> where TKey : class
{
public ICollection<KeyValuePair<TKey, IValue>> Col { get; set; }
public void Add<TValue>(TKey key, TValue value) where TValue : IValue
{
Col.Add(new KeyValuePair<TKey, IValue>(key, value));
}
}
public interface IValue
{
}
这很好用,但是,上面代码的问题是插入类型必须是 IValue 类型,因为原语不是 IValue 的实现者,它们不能被添加到列表中。
我不能使用object 代替TValue / IValue
编辑
我想使用任何!键值对的 value 参数的类型。如果可能的话,我想摆脱IValue。这是我可以编译代码的唯一方法
理想用法示例如下:
collection.Add("hello", 10);
collection.Add("peter", "temp");
collection.Add("hello1", new Foo());
collection.Add("hello2", new Bar());
编辑 我不能使用对象,因为对象并非所有对象都是可串行化的,但是,我将实现更改为
class Program
{
static void Main(string[] args)
{
var collection = new Collection<string>();
collection.Add("hello", 10);
collection.Add("peter", "temp");
collection.Add("hello", new Bar());
}
}
[Serializable]
public class KeyValuePair<TKey, TValue>
{
private TKey _key;
private TValue _value;
public KeyValuePair(TKey key, TValue value)
{
_key = key;
_value = value;
}
public TKey Key
{
get { return _key; }
set { _key = value; }
}
public TValue Value
{
get { return _value; }
set { _value = value; }
}
}
public class Collection<TKey> where TKey : class
{
public ICollection<KeyValuePair<TKey, ISerializable>> Col { get; set; }
public void Add<TValue>(TKey key, TValue value) where TValue : ISerializable
{
Col.Add(new KeyValuePair<TKey, TValue>(key, value));
}
}
编译器说argument type <TKey, TValue> is not assignable to parameter type <TKey, ISerializable>
【问题讨论】:
-
您有相互冲突的要求。您说的是要添加到仅允许类型实现
IValue的集合中的“原语”(值类型?)。 -
你能解释一下为什么不能使用对象吗?
-
为什么不能用 IValue 扩展原语并使用扩展类?
-
@CodeCaster 你误会了。我只添加了 Ivalue 以便我可以编译代码。 keyValue 类需要两种类型,而 Collection 类只定义了一种泛型类型。如果我能摆脱
IValue,那就太好了 -
@Jegan - 我可以写一个包装类......但我觉得这更像是一个黑客
标签: c# generics icollection keyvaluepair