Я не уверен, как создать объявление интерфейса для класса Generic / template. Смотрите фрагмент кода ниже. У меня есть выбор ограничения T / V из объявления интерфейса с самого начала - ОПЦИЯ 2 ниже, или вообще его не ограничивать - но тогда я не могу объявить частные коллекции _beans .
ВАРИАНТ 1 - без ограничений интерфейса, проблема в том, что я не знаю, как сделать интерфейс
public class SomeService
{
private ConcurrentDictionary<Type, IBeanContainer> _beansContainers = new ConcurrentDictionary<Type, IBeanContainer>();
private interface IBeanContainer
{
// How to declare interface ...
}
private class BeanContainer<T, V> : IBeanContainer
where V : struct where T : class
{
private readonly ConcurrentDictionary<string, IBean<T,V>> _beans = new ConcurrentDictionary<string, IBean<T,V>>();
public IBean<T,V> GetOrCreateExpressionCounter<X,Y>
(
string beanName,
TimeSpan span,
ExpressionEval<T, bool> include = null,
ExpressionEval<T, V> valueExpression = null)
{
return _beans.GetOrAdd(counterName, counter => new ExpressionCounter<T, V>(beanName, span, include, valueExpression));
}
}
}
ВАРИАНТ 2: Ограничить T / V на интерфейсе, тогда я не знаю, как объявить частную коллекцию _beans
private interface IBeanContainer
{
IBean<T, V> GetOrCreateExpressionCounter<T, V>
(
string counterName,
TimeSpan span,
ExpressionEval<T, bool> include,
ExpressionEval<T, V> valueExpression) where V : struct where T : class;
}
Затем из BeanContainer нужно объявить без, и я не могу объявить внутренний словарь _beans :
private class BeanContainer : IBeanContainer
where V : struct where T : class
{
private readonly ConcurrentDictionary<string, IBean<T,V>> _beans = new ConcurrentDictionary<string, IBean<T,V>>();
...
}
Но, по крайней мере, с ВАРИАНТОМ 1 я могу скомпилировать код, но не правильно (не могу объявить интерфейс).