gpt4 book ai didi

c# - 一个好看的代码问题(与将方法作为参数传递有关)

转载 作者:行者123 更新时间:2023-11-30 21:58:35 26 4
gpt4 key购买 nike

我一直在阅读有关在 C# 中将委托(delegate)和方法作为参数传递的内容,只是因为当我查看这段代码时,我的“强制症”困扰着我:

 public static T GetSingleItem<T>(string query, params object[] args) where T : new()
{
using (var db = new SQLiteConnection(DbPath))
{
db.Trace = true;
return db.Query<T>(query, args).FirstOrDefault();
}
}

public static List<T> GetItems<T>(string query, params object[] args) where T : new()
{
using (var db = new SQLiteConnection(DbPath))
{
db.Trace = true;
return db.Query<T>(query, args);
}
}

public static void Insert(object obj)
{
using (var db = new SQLiteConnection(DbPath))
{
db.Trace = true;
db.Insert(obj);
}
}

public static void Update(object obj)
{
using (var db = new SQLiteConnection(DbPath))
{
db.Trace = true;
db.Update(obj);
}
}

有没有办法将 using 语句和 db.Trace 封装在一个方法中,然后简单地调用方法内容的其余部分,例如db.Update(obj) 从他们的特定方法?

将分部方法作为参数传递的明显问题,例如

public static T Runner<T>(Func<T> funcToRun)

是我从 using 语句实例化的对象调用 db.Update() 吗?

对于这种模式有什么聪明的解决方案吗?

最佳答案

我并不是说这是重构它的最佳方式,但您的想法几乎就在那里,我只是对其进行了扩展。

我相信,但我不确定,这可能被称为模板方法模式(但我找到的示例不使用 Func,它们使用虚拟方法和派生类,但概念是一样的)。

你需要一个用于无效:

public static void RunAction(Action<SQLiteConnection> actionToRun)
{
using (var db = new SQLiteConnection(DbPath))
{
db.Trace = true;
actionToRun(db);
}
}

还有一个用于返回类型:

public static T RunFunc<T>(Func<SQLiteConnection, T> funcToRun) where T : new()
{
using (var db = new SQLiteConnection(DbPath))
{
db.Trace = true;
return funcToRun(db);
}
}

调用 void Action:

public static void Update(object obj)
{
RunAction(db => db.Update(obj));
}

调用返回的 Func:

public static List<T> GetItems<T>(string query, params object[] args) where T : new()
{
return RunFunc<List<T>>(db => db.Query<T>(query, args));
}

关于c# - 一个好看的代码问题(与将方法作为参数传递有关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29964801/

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