我正在尝试为我们正在开发的几个应用程序开发一个框架,我正在尝试构建的一个框架类用于创建数据库。理想情况下,我会有一个方法,我可以传递以下两个方法:CreateDatabaseTables()和ResetDatabaseValues();
例如,我可能有三个应用程序,我称之为Application1,Application2和Application3;每个应用程序将具有不同的数据库模式,我将其合并到代码中(例如,CreateDatabaseTables有一堆“创建表”命令)。我想创建一个可以被这些方法使用的单个数据库方法,因此它看起来像:
应用1
BuildLocalDatabase(CreateTablesForApp1(),ResetDatabaseValuesforApp1())
应用2
BuildLocalDatabase(CreateTablesForApp2(),ResetDatabaseValuesforApp2())
Application3
BuildLocalDatabase(CreateTablesForApp3(),ResetDatabaseValuesforApp3())
BuildLocalDatabase方法可以执行以下操作:
publid bool BuildLocalDatabase(CreateTablesForApp(),ResetDatabaseValuesforApp())
{
- see if database file exists; if it does, delete it
- create a new database file
- call CreateTablesForApp
- if the tables were created successfully, call ResetDatabaseValuesForApp
}
关于我如何能够做到这一点的任何想法。实际上我想在BuildLocalDatabase函数中做一些验证和其他事情,显然我的目标是最小化每个应用程序中的重复代码量...任何关于如何执行此操作的建议。我认为在C ++中,我可以将CreateTablesForApp和ResetDatabaseValuesForApp方法作为函数点传递,但似乎没有办法在C#中执行此操作。代表似乎确实处理得很好,因为我实际上只限于一种方法(多播似乎想要运行两次方法)。
答案 0 :(得分:4)
你想要使用代表:
public bool BuildLocalDatabase(Func<Database, bool> createTables, Action<Database> resetValues)
{
// Do initialization
if (createTables(db))
{
resetValues(db);
}
}
然后你将其称为:
BuildLocalDatabase( (db) => CreateTablesForApp1(), (db) => ResetDatabaseValuesforApp1() );
(我输入“数据库”参数以备不时之需 - 如果不需要,可以使用Func<bool>
和Action
,不带参数,只需传递方法名称直接而不是lambdas。通常这样的方法需要某种形式的参数,比如数据库连接等,所以我把它放进去。)
答案 1 :(得分:1)
嗯,基本上你可以。如果问题是关于委托语法,你需要失去一些()
并定义一个委托:
public delegate void MyDelegate();
publid bool BuildLocalDatabase(MyDelegate CreateTablesForApp, MyDelegate ResetDatabaseValuesforApp)
{
CreateTablesForApp();
...
ResetDatabaseValuesforApp();
}
并称之为:
BuildLocalDatabase(CreateTablesForApp1,ResetDatabaseValuesforApp1);
答案 2 :(得分:1)
您应该尝试使用内置代理:
如果委托没有返回值,则使用Action委托,否则使用Func委托,每个委托重载最多4个输入参数。