Klärung auf c # Delegierten / methods

Ich habe Delegierte in der Vergangenheit verwendet, damit ich mit ihrem Gebrauch und Nutzen vertraut bin. Ich habe auch viel gelesen / Forschung gemacht, aber ich versuche, meinen Kopf um diesen herum zu wickeln und nirgendwo zu kommen. Ich möchte einen Delegierten (ich glaube) verwenden, um einen Code zu kapseln oder einen Delegierten innerhalb einer Methode zu verwenden, um einen externen Code aufzurufen.

Ich benutze denselben Code an 20 verschiedenen Orten, um ein Entity Framework Update in einer Transaktion zu wickeln. Ich möchte den Code an einem Ort; Allerdings kann ich es nicht in einer Methode von selbst machen, weil es einen Mittelteil gibt, der sich jedes Mal ändert. Ich bin auf der search nach einigen Ideen / Klärung, wie ich das am besten machen kann (.net 3.5, ms sql 2010). – thnx

Codebeispiel:

void AddItem(string objDetails) { // setup method specific entity objects SomeObject obj = new SomeObject { Details = objDetails }; //////// Begin transaction code that I would like to encapsulate /////// bool success = false; using (Entities data = new Entities()) { for (int i = 0; i < s.BaseSettings.CommandRetries; i++) { using (TransactionScope transaction = new TransactionScope()) { try { ////////////////////////////////////////////////////////////// ///////// BEGIN Code that I would like to change / call different each time //////// data.AddToSOMEOBJECTs(obj); //////////////// END ////////////////////////////////// //// RETURN TO ENCAPSULATED CODE //// data.SaveChanges(false); transaction.Complete(); success = true; break; } catch (Exception ex) { if (ex.GetType() != typeof(UpdateException)) { throw new Exception("Unhandled db exception."); } } } } if (success) { data.AcceptAllChanges(); } else { throw new Exception(); } } } 

Sie übergeben die function ein Delegat (oder Lambda), die das benutzerdefinierte Bit macht

so was

 void AddItem<T>(string objDetails, Func<T> custom) { . . common . . T someReturn = custom(); . . common . } 

Fügen Sie so einen Anruf hinzu:

 Func<int> custom = () => { // do something custom return 9; } // Call common function AddItem<int>(..., custom); 

Alles, was zählt, ist, dass die interface für die Func passt, was Sie brauchen

Sie können verschiedene methods übergeben, indem Sie einen Delegierten und ein Ereignis verwenden. Hier ist ein Beispiel für eine class, die das tut:

 class SampleClass { public delegate void TransactionDelegate(); public event TransactionDelegate MyTransactionDelegate; public void DoSomething() { MyTransactionDelegate(); } } 

Sie können dann einen Lambda-Ausdruck verwenden, um methods an das Ereignis wie folgt weiterzugeben:

 class MainClass { public static void Main (string[] args) { var test = new SampleClass(); test.MyTransactionDelegate += () => {Console.WriteLine("Success");}; test.DoSomething(); } }