2009-02-26 8 views
2

Ich glaube, die Antwort darauf mag bei den Delegierten liegen, aber es fällt mir schwer, das Konzept der Delegierten zu verstehen. Das Hauptproblem besteht darin, dass jede Erklärung und jedes Beispiel von Delegierten, die ich je gelesen habe, immer um die Art und Weise handelt, etwas zu tun, was man ohne Delegierte erreichen kann, also bringt es mir nichts bei. Ich lerne am besten, wenn ich Beispiele aus der realen Welt sehe.Übergeben eines Aufrufs einer gespeicherten Prozedur von einem LINQ-Datenkontext an eine andere Methode. C#

Nun, dass das aus dem Weg ist, hier ist, was ich erreichen möchte. Ich habe einen Datenkontext (.dbml) mit zahlreichen gespeicherten Prozeduren. Ich habe auch mehrere Situationen, wo ich genau die gleichen 20 Zeilen Code verwenden, um eine Spalte in einer Tabelle zu aktualisieren, aber der einzige Unterschied anders als ein anderes Datagrid verwenden, ist die gespeicherte Prozedur aufgerufen wird. In dem Bemühen, die Menge des verwendeten Codes zu reduzieren, hatte ich auf eine Möglichkeit gehofft, den Aufruf der gespeicherten Prozedur vom Datenkontextobjekt als Parameter zu übergeben. Auf diese Weise kann ich den gesamten Code in eine wiederverwendbare Funktion verschieben. Ist das überhaupt möglich? Ich benutze Visual Studio 2008 und C#.

Danke für jede Anleitung.

Antwort

1

Während ich kann Ihnen nicht mit der sql/Stored Proc Seite der Dinge helfen, kann ich versuchen, erklären Delegierten, zumindest aus der Sicht C#.

Während Sie normalerweise Funktionen als Teil einer Klasse deklarieren (und daher stark an die Klasse gebunden sind), möchten Sie sie manchmal in eine Variable einfügen. Sobald Sie dies getan haben, können Sie es weitergeben, ähnlich wie bei jeder anderen Variablen.

So wissen wir, dass eine Zeichenfolge die Art der Variablen ist, in die Sie Text eingeben. Danach ist ein Delegat die Art der Variablen, die Sie Funktionen in stecken. Dies ist jedoch sehr verwirrend, da C# nicht konsistent oder klar ist, wie es Dinge in Ihrem Code benennt. Beachten Sie:

public void WriteText() { 
    Console.WriteLine("Hello"); 
} 

... 
Action x = WriteText; 
x(); // will invoke the WriteText function 

Hinweis wir verwenden „Aktion“, wo Logik des Codes bedeuten würde, sollte delegate x = WriteText lesen. Der Grund, warum wir dieses zusätzliche Durcheinander brauchen, ist, weil "delegate" selbst wie System.Object ist. Es enthält keine Informationen und es ist eine Art "Basisklasse" hinter allem. Wenn wir tatsächlich einen verwenden möchten, müssen wir einige Typinformationen anhängen. Dies ist, wo Action kommt die Definition von Action ist wie folgt:.

public delegate void Action(); 

Was dieser Code sagt ist „wir einen neuen Delegaten erklärt Aktion genannt, und es braucht keine Parameter und gibt void zurück“. Danach, wenn Sie irgendwelche Funktionen haben, die auch keine Parameter nehmen und void zurückgeben, setzen Sie sie in Variablen vom Typ Action.

Jetzt können Sie eine normale Funktion in einen Delegaten stecken, aber Sie können auch eine "anonyme" Funktion in einen Delegaten stecken. Eine „anonymous“ Funktion ist etwas, das Sie inline deklarieren, also eher als die bereits erklärt WriteText Funktion anbringen, konnten wir ein neues in die Mitte unseres Code wie folgt aufbauen:

Action x =() => { Console.WriteLine("Hello"); }; 
x(); // invoke our anonymous function. 

Was dies tut verwendet die C# "Lambda-Syntax", um eine neue anonyme Funktion zu deklarieren. Der Code, der als Teil der Funktion ausgeführt wird (wenn wir ihn aufrufen) ist .

SO

Um sie alle zusammen zu setzen, könnten Sie einen „Savedata“ -Funktion haben und es einen Delegierten übergeben.Es könnte 20 Tabellenzeilen erstellen und diese Tabelle dann an den Delegaten übergeben, und der Delegat könnte den entsprechenden Stored-Proc aufrufen. Hier ist ein einfaches Beispiel:

public void SaveData(Action<Table> saveFunc){ 
    var t = new Table(); 
    ... 20 lines of code which put stuff into t ... 
    saveFunc(t); 
} 

SaveData(t => StoredProc1.Invoke(t)); // save using StoredProc1 
SaveData(t => StoredProc37.Invoke(t)); // save using StoredProc37 

SO

alles gesagt zu haben. So würde ich das Problem nicht lösen. Statt den Delegaten in Ihre sitedata-Funktion zu übergeben, wäre es sinnvoller, wenn Ihre SaveData-Funktion einfach die Tabelle zurückgibt und Sie dann den entsprechenden StoredProc aufrufen könnten, ohne dass Delegierte benötigt werden.

+0

Vielen Dank. Das hat sehr geholfen. Ich habe es jetzt herausgefunden – Ziltoid

+0

Glad mein riesiger Haufen Schreiben war nützlich :-) –