2016-04-13 7 views
1

System.Data.SqlClient.SqlExceptionを拡張してプロパティを追加しようとしています。したがって、すべてのSqlCommand実行時に、例外がスローされた場合、それを捕捉し、実行されたSQLを追加して、それを再スローすることができます。SqlExceptionを拡張してプロパティを追加します。

私は以前に拡張を行っていましたが、メソッドでのみ行いました。プロパティでは、私はそれを動作させることはできません。

public static class SqlExceptionExtention{ 
    public static string query { get; set; } 
} 

スタティックフラグの追加と削除のすべての組み合わせを試しましたが、何も動作しません。もちろん、プロパティは静的ではありません。オブジェクトごとに固有のものでなければなりません。

+0

あなただけの拡張メソッドではなく、プロパティまたはフィールドを追加することができます。それをサブクラス化し、 'SqlException'をキャッチして、SQLを添付して新しい例外を再スローすることができます。 – Rob

+0

拡張機能は必要ありません。 'SqlException'を継承したカスタムクラスを作成することによって' SqlException'を拡張する必要があります。** Edit ** 'SqlException'は封印されています。 'DbException'をコンストラクタパラメータとして' SqlException'を取るクラスで拡張することができます。クエリと意味のあるメッセージです。 'SqlQueryExecutionException'と名前を付けることができます –

+0

C#は拡張プロパティをサポートしていません - [提案は議論されていますが](https://github.com/dotnet/roslyn/issues/112)。 'GetQuery()'拡張メソッドは自由に実装できますが、拡張メソッドを使用してインスタンスデータを追跡するのは複雑で複雑です。 'SqlException'は' sealed'なので、それを拡張することはできません。ラッパークラスを導入し、その 'InnerException'として' SqlException'を保持するか、あるいはSeanの答えごとに、例外があるたびに 'Data'プロパティを使います(nice catch、punを叱る)。 –

答えて

4

拡張プロパティとしては、拡張メソッドだけはありません。あなたは、あなたが辞書を移入するDataプロパティを使用することができ、データを追加したい場合は

try 
{ 
    // Do something 
} 
catch(SqlException e) 
{ 
    e.Data.Add("Foo", "Bar"); 
    throw; 
} 
関連する問題