2015-09-06 2 views
0

Мне нужно сохранить список созданных объектов в моем приложении. У меня есть абстрактный объект и ряд производных классов. Я хотел бы сохранить список созданных объектов в попытке не создавать ненужные объекты без необходимости. Im пытается сделать это с помощью приведенного ниже кода, где T получен из AbstractMapper. но получаю ошибкуСписок производных объектов

Невозможно преобразовать тип «AbstractMapper» на «T»

при добавлении его в список

protected List<AbstractMapper> Mappers = new List<AbstractMapper>() 

public AbstractMapper Mapper<T>() 
    { 
     foreach (var mapper in Mappers) 
     { 
      if (mapper.Type == typeof (T).Name) 
      { 
       return mapper; 
      } 
     } 
     var newMapper = GetClass<T>("mapper"); 
     Mappers.Add((AbstractMapper)newMapper); 
     return (AbstractMapper)newMapper; 
    } 
+0

whre вы получаете сообщение об ошибке? –

+0

привет. Благодарю. on "Mappers.Add (" – osmo

ответ

2

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

public AbstractMapper Mapper<T>() 
    where T : AbstractMapper 

Таким образом, вы ограничиваете t использование только этих T s, которые наследуются от AbstractMapper.

В любом случае, компилятор должен предупредить вас, что ваш T не конвертируется в AbstractMapper, а не наоборот.

+0

безупречный .. спасибо. – osmo

2

Вы уверены, что не видите следующую ошибку?

Невозможно преобразовать тип «T» в «» AbstractMapper

Проблема заключается в том, что компилятор не может гарантировать, что ваш общий параметр типа T является подтипом AbstractMapper. Вы должны добавить общий тип ограничения:

public AbstractMapper Mapper<T>() where T : AbstractMapper

Тогда вы могли бы рассмотреть возможность возвращения T вместо AbstractMapper.

Вы также можете использовать Dictionary вместо List, где ключ typeof(T). Если вы хотите, чтобы объект пула производных типов, вы можете также использовать статическое поле родового типа:

public static class MapperProvider<T> where T : AbstractMapper 
{ 
    public static T Instance = GetType<T>(); //static initialization 
} 

Каждый универсальный тип создан из определения MapperProvider<T> универсального типа будут иметь различные статические Instance поле и смотрит вверх соответствующий экземпляр от Mapper<T> будет таким же простым, как возврат MapperProvider<T>.Instance.

+0

совершенный .. спасибо. – osmo

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