Вызов универсального метода дает ошибку компилятора

Я хочу отделить некоторые вещи в своем коде, чтобы мне не приходилось включать библиотеки DLL, которые используются в основном проекте, также и в подпроект. Для этого я создал следующий метод для регистрации сервисов (который использует MS Common Practices Service Locator):

public static void RegisterService<TInterface>(SPSite site) where TInterface : IServiceLocatorRegisterable, new()
        {
            GetServiceLocatorConfig(site).RegisterTypeMapping<IServiceLocatorRegisterable, TInterface>(typeof(TInterface).FullName);
            InvalidateCache();

Итак, как вы видите, я создал интерфейс «IServiceLocatorRegisterable», так что я еще не привязан к конкретному интерфейсу.

В подпроекте у меня есть определенный интерфейс, который я хочу зарегистрировать в локаторе сервисов, поэтому я добавил в объявление «IServiceLocatorRegisterable»:

public interface ISapProcess : IServiceLocatorRegisterable
{ // details omitted.. }

И это код, в котором я пытаюсь зарегистрировать этот интерфейс:

public static void RegisterSapProcess(SPSite site)
{
    ServiceLocator.RegisterService<ISapProcess>(site);
}

Но я не могу скомпилировать его, так как получаю следующую ошибку компилятора:

ISapProcess должен быть неабстрактным типом с общедоступным конструктором без параметров, чтобы использовать его в качестве параметра «TInterface» в универсальном типе или методе «....RegisterService(SPSite)».

.. и, насколько я знаю, это не работает, когда я пытаюсь зарегистрировать «базовый интерфейс» напрямую (что, конечно, не имеет никакого смысла, поскольку я хочу зарегистрировать и найти конкретные интерфейсы/реализации):

ServiceLocator.RegisterService<IServiceLocatorRegisterable>(site);

У меня такое чувство, что я упускаю здесь что-то важное.


person Patric    schedule 13.12.2012    source источник
comment
Это класс SharePoint от Microsoft: msdn.microsoft.com/en -нас/библиотека/   -  person Patric    schedule 13.12.2012


Ответы (1)


Ну да - посмотрите на свое ограничение:

where TInterface : IServiceLocatorRegisterable, new()

Вы не можете написать:

ISapProcess x = new ISapProcess();

Не могли бы вы? Этого требует ограничение.

Вам нужно либо отказаться от ограничения, либо изменить аргумент типа. (Непонятно, что вы пытаетесь сделать, учитывая предоставленный вами код.)

person Jon Skeet    schedule 13.12.2012
comment
Ах я вижу. Теперь я понимаю, что вы имеете в виду, позвольте мне изменить мой код. Держать вас в курсе. - person Patric; 13.12.2012