/// <exception cref="NotSupportedException" /> private object ConvertField(ArticleField field, IArticleFilter filter) { if (field is PlainArticleField plainArticleField) { return GetPlainArticleFieldValue(plainArticleField); } if (field is SingleArticleField singleArticleField) { return ConvertArticle(singleArticleField.GetItem(filter), filter); } if (field is MultiArticleField multiArticleField) { var articles = multiArticleField .GetArticlesSorted(filter) .Select(x => ConvertArticle(x, filter)) .ToArray(); return articles.Length == 0 ? null : articles; } if (field is VirtualArticleField virtualArticleField) { return virtualArticleField.Fields .Select(x => new { fieldName = x.FieldName, value = ConvertField(x, filter) }) .ToDictionary(x => x.fieldName, x => x.value); } if (field is VirtualMultiArticleField virtualMultiArticleField) { return virtualMultiArticleField.VirtualArticles.Select(x => ConvertField(x, filter)); } throw new NotSupportedException($"Field type {field.GetType()} is not supported"); }
/// <exception cref="InvalidOperationException" /> /// <exception cref="NotSupportedException" /> private void PopulateField(ArticleObject dict, ArticleField field, ArticleContext context) { if (field is ExtensionArticleField extensionArticleField) { PopulateExtensionFields(dict, extensionArticleField, context); } else if (field is MultiArticleField multiArticleField) { dict[field.FieldName] = multiArticleField .GetArticles(context.Filter) .Select(f => ConvertArticle(f, context)) .Where(a => a != null) .ToArray(); } else if (field is SingleArticleField singleArticleField) { dict[field.FieldName] = ConvertArticle(singleArticleField.GetItem(context.Filter), context); } else if (field is PlainArticleField plainArticleField) { dict[field.FieldName] = ConvertPlainField(plainArticleField); } else { throw new NotSupportedException($"Field with type {field.GetType()} is not supported"); } }