WF 4.5:是否可以在运行时动态添加变量?

时间:2016-07-19 20:29:00

标签: c# workflow-foundation-4 dynamic-variables

我们正在撰写自定义活动。在此活动中,可以设置数据库连接字符串和存储过程的名称。在运行时,存储过程正在执行。现在我们有一些存储过程有输入参数。

是否可以在WF 4.5中为存储过程中的每个输入参数动态生成变量?从存储过程中读取参数不是问题,但我不知道如何生成变量。

实施例: 用户输入要执行的存储过程的名称(2个输入参数@ Variable1和@ Variable2)。现在变量选项卡中应该有2个变量:@ Variable1和@ Variable2。如果用户更改了存储过程中的名称,那么在变量选项卡中应该是新的参数(例如仅@ Variable2)...

我们在这个问题上花了很多时间。但我们唯一学到的是活动必须是NativeActivity,并且应该在CacheMetadata方法中添加变量。但是,如果我使用AddVariable()方法添加变量,则不会发生任何事情:(

1 个答案:

答案 0 :(得分:0)

如果您愿意加入第三方库,可以尝试使用Dapper之类的ORM工具来完成此任务。 Dapper查询通常采用匿名类型来提供其参数。从数据库中的字段创建自定义对象的典型代码如下所示:

IDbConnection db = New IDbConnection(...);
int id = 527; // normally passed in - using a hard coded value would defeat the purpose...
string myQuery = "SELECT Engine, Transmission, Make, Model, BodyStyle FROM Table WHERE ID = @ID";
Car result = db.Query<Car>(myQuery, new { ID = id }).First();

所以我相信你可以使用反射来传递类型(&#34; Car&#34;)使用反射并创建一个匿名对象或传入一个带有&#34; ID&#34;的实际对象。运行时的属性。它会自动创建一个带有结果数据的自定义Car对象,假设Car对象具有Engine,Transmission,Make,Model,BodyStyle等属性。

请注意,如果您没有提供您希望返回的类型,那么您将获得一个ExpandoObject:Creating an anonymous type dynamically? - 您也可以将其中一个传递给您的输入参数,这将是意味着你可以在运行时创建它。

这家伙想出了一个可以帮助你的Dapper通用方法:http://www.bradoncode.com/blog/2012/12/creating-data-repository-using-dapper.html

他想出的是这样的事情:

IEnumerable<T> items = null;

// extract the dynamic sql query and parameters from predicate
QueryResult result = DynamicQuery.GetDynamicQuery(_tableName, predicate);

using (IDbConnection cn = Connection)
{
    cn.Open();
    items = cn.Query<T>(result.Sql, (object)result.Param);
}

return items;