关于c#委托/方法的澄清
本文关键字:方法 委托 关于 | 更新日期: 2023-09-27 17:54:37
我过去使用过委托,所以我熟悉它们的用法和好处。我也做了大量的阅读/研究,但我试图把我的头脑围绕在这个问题上,却一无所获。我想使用委托(我相信)来封装一些代码,或者在方法中使用委托来调用一些外部代码。
我在20个不同的地方使用相同的代码来包装事务中的实体框架更新。我想在一个地方的代码;然而,我不能单独在一个方法中这样做,因为有一个中间部分每次都会改变。我正在寻找一些想法/澄清我如何才能最好地做到这一点(.net 3.5, ms sql 2010)。——非常感谢
代码示例:
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();
}
}
}
向函数传递一个委托(或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的接口匹配你需要的。
可以通过委托和事件传递不同的方法。下面是一个这样做的类的例子:
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();
}
}