У меня есть несколько методов Get____Factory
в моем приложении, и я хотел бы объединить их с дженериками, но я все еще настраиваю C# и a) я не уверен, что генерики - это правильный путь идти и б) я все еще изучаю, как C# обрабатывает дженерики.Использование обобщений для сопоставления типов интерфейсов классам
В конечном итоге у меня будет словарь/карта интерфейсов фабрики и их классов. Я не только хочу объединить все мои фабрики в простой метод доступа, но мне нужно разрешить авторам плагина регистрировать свои собственные (и иметь доступ к ним таким образом).
я начал что-то вроде этого:
Примечание: В конце концов будет словарем или способ отображения типов интерфейсов для их реализации - если/иначе условия некрасиво и временный характер, а просто способ контрольная работа.
public T GetFactory<T>() where T : IFactory {
var t = typeof(T);
if (t.Equals(typeof(IRecipeFactory))) {
var factory = new RecipeFactory();
return factory;
}
else if (t.Equals(typeof(IItemFactory))) {
var factory = new ItemFactory();
return factory;
}
else if (t.Equals(typeof(ITileFactory))) {
var factory = new TileFactory();
return factory;
}
}
Сбой Cannot implicitly convert type 'RecipeFactory' to 'T'
, так что это не сработает. В конечном итоге у меня не будет условностей, но скорее будет искать класс по типу. Тем не менее, ни одна из них не будет работать, пока я не смогу найти решение для брошенной проблемы.
На основании других ответов, я попробовал двойное литье ((T) (object)
), но это ошибки с InvalidCastException: Cannot cast from source type to destination type.
.
Либо это плохая архитектура, либо я неправильно использую дженерики.
почему вы хотите, чтобы вернуть общий тип, но тогда у вас есть объект определенного типа в ответном заявлении? !! – niceman
Я полагаю, что если вы разместите два или более примеров методов «Get ___ Factory» у вас есть, возможно, мы сможем помочь – niceman
Как упоминалось в моем сообщении, я хочу предоставить сопоставление заводских интерфейсов с их экземплярами. Я могу завершить с дюжиной классов SomethingFactory. Этот метод доступен для плагинов, которые не имеют прямого доступа к реализациям, только интерфейсы. Я добавлю больше примеров – helion3