【问题标题】:Does C# Scripting API support parameter interpolation?C# Scripting API 是否支持参数插值?
【发布时间】:2018-05-15 00:19:24
【问题描述】:

例如,我有一个这样的代码 sn-p:

string id = {id};
State state = State.observed;
HttpWebResponse response = proxyClient.ChangeState(id, state);
if (response.StatusCode != HttpStatusCode.OK)
{
    // handling error
}

我想在运行时将{id} 插入一个实际值,然后再将其交给CSharpScript,我不想定义一个Global 类来封装所有参数,如示例代码所示,我可以这样做吗?我必须将 sn-p 包装在 C# 函数中吗? 我的第二个问题是,ChangeState 函数驻留在另一个程序集中,如何告诉 C# 脚本 API 加载该程序集?

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

【问题讨论】:

  • 请定义什么是“C#脚本API”,因为不止一个。罗斯林?代码DOM?
  • @CamiloTerevinto OP 指的是 Roslyn 脚本 API。实际上是指parameterizing scripts 上的具体示例,但显然他们不想像示例中那样做。
  • @mikez 谢谢,添加标签以反映这一点。我想我需要深入了解 Roslyn :)

标签: c# roslyn


【解决方案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、在解决方案资源管理器中查看右侧并检查您的参考资料来检查您拥有哪些资源。您可以直接从文件中添加它们,不用担心。您需要研究如何热加载程序集,但我认为它可以使用反射,但不要引用我的话。

【讨论】:

  • 谢谢,但我想要的是能够在运行时从文本文件加载和运行一段 C# 代码。我正在开发一个像应用程序这样的工作流,我想开发一个活动类,可以从配置文件中获取一段 C# 代码并运行它,但代码通常需要输入参数,其值仅由父活动确定。忘了说现在所有的输入参数都是字符串。
猜你喜欢
  • 2013-04-26
  • 2011-10-17
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2010-11-03
  • 2012-02-29
  • 1970-01-01
相关资源
最近更新 更多