Есть проблема использования generic класса. Хотелось создать базовый класс для сущностей, имеющий ключ Key. Причем ключ может иметь любой value тип (int, Guid либо составной). Тип object не очень подходит для ключа, т.к. есть проблемы типо-безопастности, boxing и др. Поэтому хотелось бы использовать generic тип для базового класса сущности.
Выглядит это так (все лишнее убрал):
Базовый класс сущности
public abstract class EntityBase<TKey>
where TKey : IKey
{
private TKey _key;
public TKey Key
{
get { return _key; }
set
{
_key = value;
}
}
}
public interface IKey<T>
{
T KeyValue { get; set;}
}
public interface IKey : IKey<ValueType>
{
}
public abstract class Key<T> : IKey
where T : struct
{
private T _keyValue;
public T KeyValue
{
get { return _keyValue; }
set { _keyValue = value; }
}
ValueType IKey<ValueType>.KeyValue
{
get { return _keyValue; }
set { _keyValue = (T)value; }
}
}
Классы предметной области:
public class Person : EntityBase<Key<int>>
{
}
public class Contract : EntityBase<Key<Guid>>
{
}
Проблема возникла, когда появилась необходимость создать коллекцию объектов предметной области.
Т.к. объекты в коллекцию должны попадать различных типов был создан non generic интерфейс IKey.
Но использовать его не получается.
Dictionary<IKey, EntityBase<IKey>> dict = new Dictionary<IKey, EntityBase<IKey>>();
EntityBase<IKey> personEntity = new Person();
dict.Add(personEntity.Key, personEntity);
2-я строка не компилируется «Cannot implicitly convert type 'Person' to 'EntityBase< IKey>'»