问题描述
Ciao,我在将DateTimeResolution转换为DateTime时遇到问题,该怎么办?
system.invalidCastException:无法将类型为“ System.DateTime”的对象转换为类型为“ System.Collections.Generic.List`1 [Microsoft.Bot.Builder.Dialogs.DateTimeResolution]”。
Auth::user()
解决方法
找到一个解决方案,我刚刚创建了实体DateTimeV2并创建了Resolve Method。
方法选自以下主题:Using the prebuilt entity datetimeV2 to capture daterange
private IList<Dictionary<string,string>> DateTimeResolutor(WaterfallStepContext stepContext)
{
IList<Dictionary<string,string>> resolutionValues = null;
var culture = Culture.English;
var r = DateTimeRecognizer.RecognizeDateTime(stepContext.Context.Activity.Text,culture);
if (r.Count > 0 && r.First().TypeName.StartsWith("datetimeV2"))
{
var first = r.First();
resolutionValues = (IList<Dictionary<string,string>>)first.Resolution["values"];
var asString = string.Join(";",resolutionValues[0]);
var subType = first.TypeName.Split('.').Last();
if (subType.Contains("date") && !subType.Contains("range"))
{
// a date (or date & time) or multiple
var moment = resolutionValues.Select(v => DateTime.Parse(v["value"])).FirstOrDefault();
}
else if (subType.Contains("date") && subType.Contains("range"))
{
// range
var from = DateTime.Parse(resolutionValues.First()["start"]);
var to = DateTime.Parse(resolutionValues.First()["end"]);
}
}
return resolutionValues;
}
然后,我就可以获取变量的开始日期和结束日期:
var startDate = dateRange.FirstOrDefault()?["start"]);
var endDate = dateRange.FirstOrDefault()?["end"]);
我希望这对某人有帮助:)
我也这样做:
startDate = dateStart == DateTime.MinValue ? Convert.ToDateTime(((List<DateTimeResolution>)stepContext.Result).FirstOrDefault()?.Value) : startDate;