1

System.Funcを使用していますが、つまずきになっています。

System.Func<TReturn> // (no arg, with return value)
System.Func<T, TReturn> // (1 arg, with return value)
System.Func<T1, T2, TReturn> // (2 arg, with return value)
System.Func<T1, T2, T3, TReturn> // (3 arg, with return value)
System.Func<T1, T2, T3, T4, TReturn> // (4 arg, with return value)

受け入れる最大値は4つの引数です。

これを5つの引数に拡張する方法はありますか?

4

3 に答える 3

9

より高いバージョンの .NET Framework に移行します。たとえば、.NET 4.0 には最大 16 個の

http://msdn.microsoft.com/en-us/library/yxcx7skw.aspx

一方、3.5 には 4 つしかありません

http://msdn.microsoft.com/en-us/library/yxcx7skw(v=VS.90).aspx

または、以前のバージョンで立ち往生している場合は、デリゲートを自分で定義してください。

于 2010-08-27T09:32:11.910 に答える
5

いくつかのオプションがあります。その 1 つは、次のように自分自身のデリゲートを定義することです。

public delegate TResult Func<T1,T2,...,TN,TResult>(T1 arg1, T2 arg2,...,TN argN); 

基本的に、任意の数の引数に対して定義できます(そうしないと名前の衝突が発生する可能性があるため、4より大きい)

または、引数をある種の構造にラップして、既に定義されている Func デリゲートの 1 つを使用できるようにすることもできます。

いずれにせよ、定義済みの Func デリゲートのいずれかを使用できない場合は、メソッド シグネチャについて心配する必要があります。多くの場合、パラメーターの長いリストは、メソッドが多くの (無関係な) 作業を行っていることに気付かせる匂いです。

したがって、私の個人的なアプローチは、最も頻繁に発生する症状を修正するのではなく、設計が失敗した場所を特定し、それを修正することです (この場合、十分な引数を使用して Func を定義することで、症状が修正される可能性があります。あなたのコードを知っている)

于 2010-08-27T10:05:06.307 に答える
1

フレームワーク 5.0 では、少なくとも 25 個のパラメーターで Action と Func を見ることができると思います :)

コードを有効で保守可能なビューにリファクタリングできないため、上位のフレームワーク バージョンに移行する理由はありません。関数のシグネチャのメソッドで非常に多くのパラメータを使用することは、実際にはあまり良い方法ではありません。5 つのフィールドまたはプロパティを持つエンティティを使用します。メソッドや関数のシグネチャを変更せずに、このエンティティを拡張できます。

于 2010-08-27T09:49:38.697 に答える