C#Scripting API是否支持参数插值?

时间:2018-05-15 00:19:24

标签: c# roslyn

例如,我有一个这样的代码片段:

{id}

我希望在将CSharpScript传递给Global之前将ChangeState插入到实际值中,我不想定义一个let rec restrict (column, value, aTable) = match aTable with name,[]->[] |name,(col,vals)::rest->if col=column then (col,auxListMaker(vals,trueFalseList))::restrict (column,value.(name,rest)) else restrict (column,value.(name,rest)) let rec auxTrueFalser (column, value, aTable) = match aTable with name,[]->[] |name,(col,vals)::rest-> if column=col then (if List.hd vals = value then true::aux1(column,value,(name,[(col,List.tl vals)])) else false::aux1(column,value,(name,[(col,List.tl vals)]))) else aux1(column,value,(name,rest)) in let trueFalseList = auxTrueFalser (column, value, aTable) in let rec auxListMaker (vals, trueFalseList) = match vals with []->[] |h::t -> if List.hd trueFalseList then h::auxListMaker(t,List.tl trueFalseList) else auxListMaker(t,List.tl trueFalseList) in 类来封装所有参数,如示例代码显示,我能这样做吗?我必须将代码段包装在C#函数中吗? 我的第二个问题是,add_action('template_redirect','custom_shop_page_redirect'); function custom_shop_page_redirect(){ if (class_exists('WooCommerce')){ if(is_product()){ wp_redirect( 'https://google.com' ); exit(); } } return; } 函数驻留在另一个程序集中,如何告诉C#脚本API加载该程序集?

编辑:这背后的故事有点奇怪的问题是,我正在开发像应用程序这样的工作流程,我想创建一个活动类可以从配置文件中获取一段C#代码并运行它,但代码通常需要输入参数哪些值仅从父活动确定,现在所有输入参数都是字符串。

1 个答案:

答案 0 :(得分:1)

我认为你需要的是一个在这种情况下接受参数的Lambda。

您想要了解两种主要类型;行动和功能。 操作类型不返回任何变量,Func类型具有返回类型。您可以对它们进行模板化,使事情变得更加灵活。

您可以在运行时创建它们,并根据需要进行编辑。因此,如果您处于一个大循环中并且您需要调整某些功能,则可以通过简单的变量赋值来改变输入和输出。

Action<string> idCheckAction = (string _id) =>
{
    Console.WriteLine("ID = " + _id);
};

Func<string, string> idCheckFunc = (string _id) =>
{
    return "ID = " + _id;
};

idCheckAction("123"); // "ID = 123"

string concat = idCheckFunc("123"); 
Console.WriteLine(concat); // "ID = 123"

这样的东西可用于控制台日志记录,因为你可以存储一个字符串值列表+ Action / Func值,然后通过关键字或迭代器调用这些函数。

关于程序集加载的主题,我相信一个简单的using (X)就足够了。您可以进入visual studio,查看解决方案资源管理器中的右侧并查看参考资料,以查看您拥有的资源。你可以直接从文件中添加它们而不用担心。您需要研究如何加载程序集,但我认为它可以与Reflection一起使用,但请不要引用我。