0

次のようなステートメントがあるとします。

List<string> list = new List<string> {"1", "1", "2", "3", "4"};
try
{
    Class1 c = new Class1
        {
            s1 = list.Single(s => s == "1"),
            s2 = list.Single(s => s == "2"),
            s3 = list.Single(s => s == "3"),
            s4 = list.Single(s => s == "4")
        };
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message);
}

そして、間違いなくcatch、この行に「入力シーケンスには複数の要素が含まれています」というエラーが表示されるブロックに移動します。

s1 = list.Single(s => s == "1")

だから、私はちょうど好奇心が強い、catchブロック内のエラー述語を表示する方法はありますか? これは、「シーケンス内に重複した要素 "1" がありました」のようなものが表示される場合、バグを修正するのに非常に役立ちます。または文字列形式の完全な述語です。どうにかしてこの情報を表示し、表示またはログに記録できますか?

4

3 に答える 3

4

述語とそのパラメーターに関する情報が本当に必要な場合は、独自のSingle拡張メソッドを作成できます(デフォルトのメソッドの代わりに呼び出されます)。これは実際にはデフォルトのSingle呼び出しをラップしますが、 Expression(ラムダ式を表す式ツリー)を受け取ります。 Func(ラムダ式)の代わりに:

public static T Single<T>(this IEnumerable<T> sequence, 
                          Expression<Func<T, bool>> predicate)
{
    try
    {
        return sequence.Single(predicate.Compile());
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine("Error on predicate " + predicate);
        throw;
    }            
}

オンラインs1 = list.Single(s => s == "1")では、例外がスローされ、かなりのエラーメッセージが書き込まれます。

Error on predicate s => s == "1"

于 2012-11-01T14:46:18.693 に答える
2

いいえ、スローされた例外(InvalidOperationException)は一般的なものであり、そのような詳細は提供されません。スタックトレースはで始まり、Single()渡された述語は表示されません。

そのレベルの詳細が必要な場合は、スタックトレースから行番号を取得できるように個別のステートメントでプロパティを設定するか、データの「事前チェック」を実行して、次の条件を満たしていることを確認できます。独自性。

于 2012-11-01T14:39:54.500 に答える
-1
List<string> list = new List<string> {"1", "1", "2", "3", "4"};
string sValue=null;
try
{
    sValue="1";
    Class1 c = new Class1
    {
       s1 = list.Single(s => s == sValue),

    };
}
catch (InvalidOperationException ex)
{
    Console.WriteLine("s => s == "+ sValue);
}
于 2012-11-01T14:39:07.380 に答える