传递多种方法(委托?)

时间:2010-07-29 17:22:41

标签: c#

我正在尝试为我们正在开发的几个应用程序开发一个框架,我正在尝试构建的一个框架类用于创建数据库。理想情况下,我会有一个方法,我可以传递以下两个方法: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#中执行此操作。代表似乎确实处理得很好,因为我实际上只限于一种方法(多播似乎想要运行两次方法)。

3 个答案:

答案 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个输入参数。