2014-12-14 2 views
0

У меня есть следующая настройка, где я создаю реестр моих интерфейсов, но я не знаю, как избежать использования дженериков. Ниже, конечно, дается компиляционная ошибка. Каков правильный способ установить что-то подобное? У меня будет несколько реализаций MyInterface, поэтому я хочу иметь доступ к ним во время выполнения из реестра.Использовать общий интерфейс без спецификаций?

public interface MyInterface<T1, T2> { 
} 

public static class ApiEntityMapperRegistry { 
     private static Dictionary<Type, Type> registry = new Dictionary<Type, Type>(); 

     public static void Register<T2, T3>() { 
      if (!registry.ContainsKey(typeof(T2))) { 
       registry.Add(typeof(T2), typeof(T3)); 
      } 
     }   

     // this method doesn't compile 
     public static MyInterface<T1, T2> GetMapper(){ 
      return null; 
     } 
    } 
} 

Или, может быть, существует лучший подход?

+1

'GetMapper()' также должны иметь общие TypeArguments возможно? 'GetMapper ()' –

+0

Что такое 'IApiEntityMapper '? –

+0

@AdrianNasui - Исправлено ... It's MyInterface –

ответ

3

Если вы хотите, чтобы ваш код для компиляции использовать общее определение метода:

public static IApiEntityMapper<T1, T2> GetMapper<T1, T2>(){ 
    return null; 
} 
+0

Проблема с этим заключается в том, что T2 не имеет отношения к методу get Mapper ... –

+0

@AdamLevitt К сожалению, это относится к типу возвращаемого значения, поэтому оно становится актуальным для общего метода – dotnetom

+0

@AdamLevitt Поскольку C# статически типизирован и обобщен типы не являются динамическими типами, вы все равно должны иметь всю необходимую информацию для возвращаемого типа. В противном случае вы можете просто вернуть «Тип», а затем отправить его позже; но это все равно потребует от вас знать тип цели. – poke

Смежные вопросы