反序列化 JSON 以常量折叠方式映射 C#

Deserialize JSON Map in a constant-foldable way C#

我需要将 映射的字符串表示形式传递到我的 U-SQL 程序中,并将其反序列化为 C# Dictionary 以便我可以将其转换为一个U-SQL SqlMap。我需要以 constant-foldable 的方式进行。我最近的尝试:

DECLARE @MapStr string = "{\"key\": \"val\"}";
DECLARE CONST @map = new SqlMap<string,string>(JsonConvert.DeserializeObject<Dictionary<string, string>>(@MapStr));

失败并显示“E_CSC_USER_EXPRESSIONNOTCONSTANTFOLDABLE:表达式不能常量折叠。”

我发现了多种将字符串反序列化为映射的方法,但 none 到目前为止都是可折叠的。我找不到常量可折叠 C# 表达式的列表,这在这里也很有用。

来自docs

... can be computed at compile time (so called constant-foldable expressions)

在 C# 中常量是 defined as:

immutable values which are known at compile time and do not change for the life of the program. Constants are declared with the const modifier. Only the C# built-in types (excluding System.Object) may be declared as const. User-defined types, including classes, structs, and arrays, cannot be const.

看来你只能使用C#中可以定义为常量的东西,所以你只能使用built-in类型的表达式(不包括System.Object)。

如果有人好奇,我相信这是不可能的:

  • 只有字符串和内置类型表达式是常量可折叠的,不包括对象(例如数组和映射)。 (有关此链接,请参阅其他答案)
  • 没有计算为 SqlMap 的内置表达式或字符串表达式
  • 因此不存在求值为 SqlMap 的常量可折叠表达式

为了我的特定目的,我能够使用一个创建 CONST SqlMaps 的配置文件并使用它,但如果我们有超过一组有限的可能输入,那将是不可能的。