2017-05-31 3 views
0

次の2つのオーバーロードされた関数を検討してください。最初のものは、単一の値をリストにラップし、複数の値をとるものに渡します。オーバーロードのない単一またはIEnumerableパラメータを取る

オーバーロードされた単一の機能が必要ないように感じます。単一または列挙型を扱うことができる関数が1つしかないため、あまりにも簡単ではありませんか?

public static void Insert<T>(EntityType entityType, long entityId, string shortName, T value, string owner = null, OptionSearch optionSearch = OptionSearch.Name) 
    { 
     Insert(entityType, entityId, shortName, new List<T> {value}, owner, optionSearch); 
    } 

    public static void Insert<T>(EntityType entityType, long entityId, string shortName, IEnumerable<T> values, string owner = null, OptionSearch optionSearch = OptionSearch.Name) 
    { 
     // Do all the stuff and things using a list of values. 
    } 

通常、それはちょうどそれが不要思われてしまう私は、過負荷を気にしないだろうが、すべてのこれらのパラメータで(そしてそれらを一つの入力オブジェクトを作成するオプションはありません)。

はPS:Passing a single item as IEnumerable<T>関連だけではないので、多くのオーバーロードを行う方法を説明していることかコメントに提案以外の過負荷を回避するための方法はありません

+0

'params'を使用できますか? – CompuChip

+0

私はこれを行う方法が現在あるとは思わない。パラメータを並べ替えると配列パラメータを得るためにparamsを使うことができますが、それはIEnumerableではなく配列です。あなたがやっていることに応じて、それはうまくいくかもしれません。そうでなければ、C#に 'params IEnumerable'という話がありましたが、まだそれを作ったという証拠は見つかりませんでした。 – Chris

+0

最後のパラメータになるように値を移動すると、' params T [] values'、これは両方を受け入れます。キャッチは、議論の順序を変えることで、それはそれに対する議論になる可能性があるということです。 – Icepickle

答えて

1

それを取り除くために、それは次のようになります。 あなたはvaluesパラメータは、最後の一つである配列に変更し、そしてparamsキーワードを使用して取得できます。

public static void Insert<T>(... other parameters... , params T[] values)

を次に、あなたは、単一ので、配列でメソッドを呼び出すことができるようになります210パラメータ、またはコンマで区切ったTパラメータを使用します。ただし、IEnumerable<T>は使用できません。

実際にこれを行うには、過負荷をかけることが最善の方法だと思います。ただへの単一の引数をキャストするための入力としてIEnumberableを取る一つの方法を使用して、ユーザーが必要とする、わからhttps://github.com/dotnet/csharplang/issues/179

+0

パラメータを使用してパラメータを使用することはできません –

0

:あなたは次のリンクを使用することができますC#のにIEnumerable<T>paramsパラメータを含むの提案を追跡するために このような配列:

////Bool for example 

Insert<bool>(... new bool[] { singleBool }, ...) 

とする方法を変更します。私は気づいた

public static void Insert<T>(EntityType entityType, long entityId, string shortName, IEnumerable<T> values, string owner = null, OptionSearch optionSearch = OptionSearch.Name) 
{ 
    Insert(entityType, entityId, shortName, new List<T> {value}, owner, optionSearch); 
} 

、が、この方法は、自分自身を参照していること...それがないことを確認してくださいあなたが何をしたいか。

関連する問題