我有一个班级(让我们说 XYZ ),我将 XYZ 类型的列表作为按钮传递给英雄卡,这样当用户点击一个按钮,它返回被点击的项目的值。我有一个名为 getResult 的方法,它需要一个类型 XYZ 的值。
private async Task getResult(IDialogContext context, IAwaitable<XYZ> result)
{}
上述方法是从context.Wait<XYZ>(getResult);
但是当我点击按钮时,会发生错误(InvalidTypeException: invalid type: expected Microsoft.MscaBot.Data.XYZ, have Activity
)。
如何避免此错误并收到用户点击的项目?
更新 :(以下是我的代码的样子)
[Serializable]
public class XYZ
{
public override string ToString()
{
return name;
}
public string name { get; set; }
public Nullable<decimal> price { get; set; }
}
其他课程:
[Serializable]
public class TestDialog : IDialog<object>
{
private static List<XYZ> listOfXYZ = new List<XYZ>() { new XYZ() { name = "MyName1", price = 20.23 }, new XYZ() { name = "MyName2", price = 50.63 } };
public async Task StartAsync(IDialogContext context)
{
await ShowOptions (context);
}
private async Task ShowOptions(IDialogContext context)
{
var replyToConversation = context.MakeMessage();
replyToConversation.Type = "message";
List<CardAction> cardButtons = new List<CardAction>();
foreach (var item in listOfXYZ)
{
CardAction CardButton = new CardAction()
{
Type = ActionTypes.ImBack,
Title = item.ToString(),
Value = item
};
cardButtons.Add(CardButton);
}
HeroCard heroCard = new HeroCard()
{
Text = "Please select one of the options below",
Buttons = cardButtons,
};
Attachment myAttachment = heroCard.ToAttachment();
replyToConversation.Attachments.Add(myAttachment);
replyToConversation.AttachmentLayout = "list";
await context.PostAsync(replyToConversation);
context.Wait(getResult);
}
private async Task getResult(IDialogContext context, IAwaitable<IMessageActivity> result)
{
// Some logic here
}
}
答案 0 :(得分:1)
>...<div></div><svg>...</svg><
(或任何其他卡片)的CardAction最终会向机器人发布HeroCard
。该活动的文本将是您在IMessageActivity
中设置的值。
你想做的事是不可能的。您需要等待CardAction
。如果您尝试将复杂对象作为值发送,请确保该对象可序列化,否则它将无法正常工作。