小编Art*_*ous的帖子

使用自适应卡设计器,然后在C#中使用实际值替换样本值

目标

我想使用自适应卡设计器创建(然后编辑)自适应卡设计,并在我的机器人中使用它们.

步骤

1)我在Designer中创建了自适应卡,带有样本值,并复制了它的JSON表示.例如:

{
  "type": "AdaptiveCard",
  "body": [
    {
      "type": "FactSet",
      "id": "myFactSet",
      "facts": [
        {
          "title": "Name:",
          "value": "John Doe"
        }
      ]
    }
  ],
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.0"
 }
Run Code Online (Sandbox Code Playgroud)

2)现在我想在我的C#Bot Framework机器人中使用这张卡的设计.我把这个JSON放到我的项目中,其中包含了AdaptiveCards v1.1.0 nuget包.

3)我用这行代码将卡JSON解析为AdaptiveCards库类:

var card = AdaptiveCard.FromJson(card).Card;
Run Code Online (Sandbox Code Playgroud)

4)在将卡发送给用户之前,我必须用实际值填充它,替换样本数据.

问题

  1. 如何"John Doe"使用真实用户名替换?什么是最简单的方法?(我已经写了一个扩展方法来获取AdaptiveElement它的id,所以我可以很容易地改变它的值.但请告诉我,如果有一个更简单的方法)

  2. 我如何克隆现有的AdaptiveElement并将其他值放入其中?例如,如果我想FactSet通过复制现有myFactSet的所有相同样式来添加另一个卡?AdaptiveElementClone()办法.

为什么其他解决方案不合适

用C#写

我希望能够使用Designer轻松编辑卡片的设计,但如果我用C#代码重写整张卡片,每次卡片的设计发生变化时我都要对其进行更改,我不会看到设计师的结果.

在javascript中执行此操作

我知道用javascript很容易做到,但我在我的机器人中使用C#.

解析JSON并使用它

我也明白,我可以解析卡片JsonObject并直接处理JsonObjects,克隆它们,改变它们的属性,但是

  1. 它们没有输入,因此没有IntelliSense支持,我可以输入错字

  2. 我仍然需要遍历所有元素以找到具有给定id的那个元素(顺便说一句,是否有一个扩展方法可以轻松地执行此操作?)

  3. 使用JsonObject不会消除AdaptiveCards库的需要和调用AdaptiveCard.FromJson(card) …

c# botframework adaptive-cards

8
推荐指数
1
解决办法
1836
查看次数

C# Serilog:如何使用字符串插值进行记录并将参数名称保留在消息模板中?

如何替换此代码:

string name = "John";
logger.Information("length of name '{name}' is {nameLength}", name, name.Length);
Run Code Online (Sandbox Code Playgroud)

像这样或类似的 C# 字符串插值

string name = "John";
// :-( lost benefit of structured logging: property names not passed to logger
logger.Information($"length of name '{name}' is {name.Length}");
Run Code Online (Sandbox Code Playgroud)

但保持结构化日志的属性名称工作?

好处是:

  1. 提高可读性
  2. 您永远不会忘记参数列表中的参数或消息模板中的属性名称,尤其是当您更改日志记录代码时
  3. 您始终知道此属性名称将打印到您的日志中

c# logging string-interpolation serilog formattablestring

6
推荐指数
1
解决办法
2628
查看次数

Metro/WinRT/Windows 8是否可以从后面的代码中清除元素的绑定?

我有一组需要TextBox在页面上填充一组内容的项目.每次用户单击另一个项目时,我想从最后一个项目中删除旧绑定,并为当前项目设置新绑定.如果我不这样做,The object is immutable则抛出WinRT 异常.

此代码在选择第一个项目时有效,但在下一个项目选择时抛出异常.

titleBinding.Source = selectedItem;
TitleBox.SetBinding(TextBox.ValueProperty, _titleBinding);
Run Code Online (Sandbox Code Playgroud)

c# microsoft-metro windows-8 windows-runtime

4
推荐指数
1
解决办法
1368
查看次数