关于c#委托人/方法的澄清

问题描述:

我以前使用过委托人,所以我很熟悉他们的使用和好处。我也做了很多的阅读/研究,但是我正在试图绕过这一点,并且无处可去。我想使用委托(我相信)封装一些代码或在方法中使用委托来调用一些外部代码。关于c#委托人/方法的澄清

我在20个不同的地方使用相同的代码来封装事务中的实体框架更新。我想在一个地方的代码;然而,我不能单靠一种方法来完成,因为每一次都有一个中间部分会改变。我正在寻找一些关于如何最好地执行此操作的想法/说明(.net 3.5,ms sql 2010)。 - 日Thnx

代码示例:

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(); 
      } 
     } 
    } 
+0

我可能是盲目的,但如果是'了'界定? – Prescott

+0

同样在你想改变的部分,你能展示你还可能喜欢它的其他部分吗? – Prescott

+0

我想改变的部分将永远是框架中某个表的更新;然而,这些表格每次都会根据正在更新的内容而改变。我修复了代码引用。基本上,事务只是包装更新(每次都需要更改)。 – Adam

你传递给函数委托(或lambda),做自定义位

这样

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

添加通话像这样也许:

Func<int> custom =() => { 
    // do something custom 
    return 9; 
} 

// Call common function  
AddItem<int>(..., custom); 

重要的是Func的接口匹配你需要的接口。

+0

谢谢 - 有道理;我有正确的思维过程,但我之前没有使用过这种语法,所以不得不多玩一点。 – Adam

您可以通过使用委托和事件来传递不同的方法。这里有一个类,做这个的一个例子:

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

    public void DoSomething() 
    { 
     MyTransactionDelegate(); 
    } 

} 

然后,您可以使用lambda表达式的方法传递给这样的事件:

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