私が書いているジェネリックメソッドに問題があります。次の署名があります。
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;
問題は、新しいオブジェクトをキャストしないと、最適なオーバーロードされたメソッドの一致に無効な引数エラーが発生することです。上記のように T キャストを追加することは、新しい Thing() では問題ありませんが、他の新しい呼び出しでは型 'ThingA' を 'T' に変換できません。Intellisense は T が Thing であることを示していますが、他のオブジェクトを Thing から継承しているため、Thing にキャストできない理由がわかりません。
おそらく、これは私がやろうとしていることを行う正しい方法ではありません。私は正しい軌道に乗っていますか?おそらくいくつかの小さなニュアンスが欠けているのでしょうか、それともまったく別のことをすべきでしょうか?