Мне нужен класс коллекции пар ключ-значение, где я не знаю тип ключа на уровне создания экземпляра, но плохо знаю тип значения только при добавлении нового элемента в коллекцию.
Рассмотрим фрагмент кода ниже
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
ИЗМЕНИТЬ
Я хотел бы использовать любой! тип для параметра значения пары ключ-значение. Если возможно, я хотел бы избавиться от IValue
. Это был единственный способ заставить код компилироваться.
Пример идеального использования выглядит следующим образом:
collection.Add("hello", 10);
collection.Add("peter", "temp");
collection.Add("hello1", new Foo());
collection.Add("hello2", new Bar());
EDIT Я не могу использовать объект, так как объект не все объекты сериализуемы, однако я изменил реализацию на
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
. - person CodeCaster   schedule 05.06.2015IValue
, было бы здорово - person Aiden Strydom   schedule 05.06.2015Dictionary<TKey, object>
? - person dureuill   schedule 05.06.2015