我正在编写的通用方法遇到了一些麻烦。它具有以下签名;
public static ThingCollection<T> GetThings<T>(...) where T : Thing
有几个类;从 Thing 继承的 ThingA、ThingB 和 ThingC;我希望能够在方法中包含类似这样的代码。
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;
问题是如果我不强制转换新对象,我会得到一个最佳重载方法匹配无效参数错误。为 new Thing() 添加如上所示的 T 转换很好,但报告无法将类型 'ThingA' 转换为 'T'以用于其他新调用。Intellisense 表明 T 是一个事物,但我不明白为什么我不能将其他对象转换为事物,因为它们继承自它。
也许这不是做我想做的事情的正确方法。我在正确的轨道上吗?也许错过了一些细微的差别,或者我应该完全做其他事情吗?