Объявление интерфейса C # для общего / шаблонного класса - PullRequest
0 голосов
/ 14 января 2019

Я не уверен, как создать объявление интерфейса для класса 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 я могу скомпилировать код, но не правильно (не могу объявить интерфейс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...