public static async Task <QueryValueResult> QueryValueFromLuisAsync( ILuisService service, ILuisAction action, string paramName, object paramValue, CancellationToken token, Func <PropertyInfo, IEnumerable <EntityRecommendation>, EntityRecommendation> entityExtractor = null) { var originalValue = paramValue; service.ThrowIfNull(nameof(service)); action.ThrowIfNull(nameof(action)); service.ThrowIfNull(nameof(service)); paramValue.ThrowIfNull(nameof(paramValue)); if (string.IsNullOrWhiteSpace(paramName)) { throw new ArgumentNullException(nameof(paramName)); } var result = await service.QueryAsync(paramValue.ToString(), token); var queryIntent = result.Intents.FirstOrDefault(); if (!Intents.None.Equals(queryIntent.Intent, StringComparison.InvariantCultureIgnoreCase)) { var newAction = new LuisActionResolver(action.GetType().Assembly).ResolveActionFromLuisIntent(result, out string newIntentName); if (newAction != null && !newAction.GetType().Equals(action.GetType())) { return(new QueryValueResult(false) { NewAction = newAction, NewIntent = newIntentName }); } } var properties = new List <PropertyInfo> { action.GetType().GetProperty(paramName, BindingFlags.Public | BindingFlags.Instance) }; if (!AssignEntitiesToMembers(action, properties, result.Entities, entityExtractor)) { return(new QueryValueResult(AssignValue(action, properties.First(), originalValue))); } return(new QueryValueResult(true)); }