Во-первых, я думаю, что вы хотели использовать ConcurrentDictionary
, поскольку у вас есть пара ключ / значение.
Во-вторых, вы можете сделать это аналогично ICloneable.У ICloneable есть метод, который возвращает Object
вместо T.
private ConcurrentDictionary<Type, Object> Cache { get; set; }
Так как он является частным, вы можете управлять им внутренне и приводить его по мере необходимости.Очевидно, что вам нужно убедиться, что у любых вызовов функций есть определение typeparam, например:
//I omitted error checking on all the examples.
public class Foo : EntityBase { ... }
void DoSomething<Foo>()
{
var someClass = Cache[typeof(Foo)] as ISomeInterface<Foo>
someClass.Bar();
}
Кроме того, даже если свойство имеет другой модификатор (public, internal, protected), вы можете добавлять комментарии к вызывающимчто Object является универсальным типом ISomeInterface, где T является EntityBase, new ().Затем они просто должны привести, как им нужно.
Вы также можете иметь универсальные методы для неуниверсального класса, чтобы получить кэшированный элемент как универсальный тип:
ISomeInterface<T> GetInstance<T>()
where T : EntityBase, new()
{
return Cache[typeof(T)] as ISomeInterface<T>;
}
void AddInstance<T>(ISomeInterface<T> instance)
where T : EntityBase, new()
{
Cache[typeof(T)] = instance;
}
void DoSomething<T>()
{
var someClass = GetInstance<T>();
someClass.Bar();
}