2016-04-13 10 views
1

Ich versuche, System.Data.SqlClient.SqlException zu erweitern und eine Eigenschaft hinzuzufügen. So dass ich bei jeder SqlCommand Ausführung, wenn eine Ausnahme ausgelöst wird, kann ich es erfassen, fügen Sie die SQL, die ausgeführt wurde, und werfen Sie es erneut.SqlException erweitern und eine Eigenschaft hinzufügen

Ich habe Erweiterungen vorher gemacht, aber nur mit Methoden. Mit Eigenschaften kann ich es nicht funktionieren.

Ich habe alle Kombinationen von Hinzufügen und Entfernen der statischen Flagge versucht, und nichts funktioniert. Natürlich kann die Eigenschaft nicht statisch sein, sondern muss für jedes Objekt spezifisch sein.

+0

Sie können nur Erweiterungsmethoden hinzufügen, nicht Eigenschaften oder Felder. Sie können eine Unterklasse erstellen, die 'SqlException' abfangen und dann Ihre neue Ausnahme mit der angehängten sql erneut auslösen. – Rob

+0

Sie benötigen keine Erweiterung. Sie müssen 'SqlException' erweitern, indem Sie eine benutzerdefinierte Klasse erstellen, die von ihr erbt. ** Bearbeiten **' SqlException' ist versiegelt, das geht nicht. Sie könnten 'DbException' mit einer Klasse erweitern, die' 'SqlException' 'als Konstruktorparameter, die Abfrage und eine aussagekräftige Nachricht verwendet. Sie könnten es 'SqlQueryExecutionException' nennen. –

+0

C# unterstützt keine Erweiterungseigenschaften - obwohl [Vorschläge wurden diskutiert] (https://github.com/dotnet/roslyn/issues/112). Sie können eine 'GetQuery()' Erweiterungsmethode implementieren, aber die Verfolgung von Instanzdaten durch Erweiterungsmethoden ist knifflig und kompliziert. Da 'SqlException'' versiegelt' ist, können Sie es auch nicht erweitern. Erwägen Sie die Einführung einer Wrapper-Klasse und halten Sie die 'SqlException' als' InnerException' davon - oder verwenden Sie nach Seans Antwort die 'Data'-Eigenschaft, die jede Ausnahme hat (netter Fang, entschuldigen Sie das Wortspiel). –

Antwort

4

Es gibt keine Erweiterungseigenschaften, nur Erweiterungsmethoden.

Wenn Sie Daten hinzufügen, dann könnten Sie die Data Eigenschaft verwenden, um das Wörterbuch zu füllen:

try 
{ 
    // Do something 
} 
catch(SqlException e) 
{ 
    e.Data.Add("Foo", "Bar"); 
    throw; 
}