У меня возникли проблемы с общим методом, который я пишу. Имеет следующую подпись:
public static ThingCollection<T> GetThings<T>(...) where T : Thing
Есть несколько классов; ThingA, ThingB и ThingC, которые наследуются от Thing; и я хочу, чтобы в методе было что-то вроде этого.
var things = new ThingCollection<T>();
if (typeof(T) == typeof(Thing))
foreach (var item in someCollection)
things.Add((T)new Thing(...));
else if (typeof(T) == typeof(ThingA))
foreach (var item in someCollection)
things.Add((T)new ThingA(...));
else if (typeof(T) == typeof(ThingB))
foreach (var item in someCollection)
things.Add((T)new ThingB(...));
else if (typeof(T) == typeof(ThingC))
foreach (var item in someCollection)
things.Add((T)new ThingC(...));
else
throw new Exception("Cannot return things of type " + typeof(T).ToString());
return things;
Проблема в том, что я получаю лучшее совпадение перегруженного метода с ошибочными аргументами ошибка, если я не приведу новые объекты. Добавление приведений T, как показано выше, подходит для нового Thing (), но сообщает Невозможно преобразовать тип 'ThingA' в 'T' для других новых вызовов. Intellisense означает, что T - это вещь, но я не понимаю, почему я не могу привести другие объекты к вещи, поскольку они наследуются от нее.
Возможно, это не правильный способ делать то, что я пытаюсь сделать. Я на правильном пути? Возможно, пропущен какой-то маленький нюанс, или я должен заниматься чем-то другим полностью?