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.
Vielen Dank. Das hat sehr geholfen. Ich habe es jetzt herausgefunden – Ziltoid
Glad mein riesiger Haufen Schreiben war nützlich :-) –