gpt4 book ai didi

c# - 将方法作为参数传递

转载 作者:太空狗 更新时间:2023-10-29 18:04:10 25 4
gpt4 key购买 nike

我有一个方法 SaveChanges<T>(T object)这在我的代码中经常被调用,除了取决于调用该方法的操作,从 SaveChanges 中会调用一个不同的方法。像这样的……

protected void SaveChanges<T>(T mlaObject, SomeFunction(arg))
where T : WebObject
{
try { this._db.SaveChanges(); }
catch (Exception e)
{
Console.WriteLine("Error: " + e);
SomeFunction(arg);
}
}

使用示例:

SaveChanges<MlaArticle>(article, article.Authors.Remove(person)) //person is an object of type MlaPerson
//OR
SaveChanges<MlaArticle>(article, article.RelatedTags.Remove(tag)) //tag is an object of type Tag
//OR
SaveChanges<MlaArticle>(article, article.RelatedWebObjects.Remove(location)) //location is an object of type MlaLocation

我已经阅读了委托(delegate)方法,但对于如何根据我的要求实现它或者我的要求是否完全可以保证使用委托(delegate),我感到有些困惑。

编辑:另外,是否可以传递多个操作?

最佳答案

怎么样:

protected void SaveChanges<T>(T mlaObject, Action<T> rollback)
where T : WebObject
{
try { this._db.SaveChanges(); }
catch (Exception e)
{
Console.WriteLine("Error: " + e);
rollback(mlaObject);
}
}

像这样调用:

this.SaveChanges(myObj, x => article.Authors.Remove(x));

现在,从你的问题的第二次阅读来看,我没有看到传递 mlaObject 的意义,因为它从未被使用过。

// this.SaveChanges(
// () => article.Authors.Remove(author),
// () => article.RelatedTags.Remove(tag));
protected void SaveChanges(params Action[] rollbacks)
{
try { this._db.SaveChanges(); }
catch (Exception e)
{
Console.WriteLine("Error: " + e);
foreach (var rollback in rollbacks) rollback();
}
}

// Overload to support rollback with an argument
// this.SaveChanges(
// author,
// article.Authors.Remove,
// authorCache.Remove);
protected void SaveChanges<T>(T arg, params Action<T>[] rollbacks)
{
try { this._db.SaveChanges(); }
catch (Exception e)
{
Console.WriteLine("Error: " + e);
foreach (var rollback in rollbacks) rollback(arg);
}
}

关于c# - 将方法作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com