APIのジェネリック拡張メソッドを作成するときに、コレクションの戻りタイプを選択するというジレンマに陥っています。どのコレクションタイプを返すか、そしてデザインの選択はどうあるべきかについてのSOに関する議論を読みました。私は通常、最も基本的な型を引数として受け入れ、最も豊富な型を返すことを好みます。
私は今、提供されているのと同じタイプを返すことを考えています。これが良い選択であるかどうかに関係なく、これを使いやすい方法で達成できる方法はありますか?
たとえば。私はこれを持ってみましょう:
public static IEnumerable<T> Generize<T>(this IEnumerable<T> source)
where T : new()
{
var lst = source.ToList();
lst.Add(new T());
return lst.AsEnumerable(); //since return type is IEnumerable.
}
ここで、引数に応じてIEnumerable
、ICollection
またはを返します。だから私はこれを少し修正しました。IList
source
public static S Generize<S, T>(this S source) where S : IEnumerable<T>
where T : new()
{
var lst = source.ToList();
lst.Add(new T());
return (S)lst.AsEnumerable(); //not sure if this works
}
私が直面している主な問題は、関数を呼び出せないことですGenerize
。
var d = new List<int> { 23, 23 };
d.Generize(); //can not find definition and no extension method by the name.....
d.Generize<List<int>, int>(); //works but so ugly..
マークが指摘しているように、キャスティングはどこでも機能するわけではありません。とにかくif
S
からタイプのコレクションを返すより良い方法はありますか?List<T>
S
IEnumerable<T>
タイプが自動的に推測されるように、タイプを指定せずに実行できますか?
また、なぜエラーではなくエラー
d.Generize()
を出すのですか?definition not found
types cannot be inferred
編集:
どんな具体的なタイプでもかまいませんIEnumberable<T>
が、私の場合、それはnamsespaceのようなT[]
、またはList<T>
それ以上のものだけが通常見られるものでした。Linq
それらすべてを処理するのは簡単ではありません。元の質問が今は意味をなさないことを指摘するだけです。皆さんありがとう..!