我正在寻找Elasticsearch的{{3}}库。试图创建类似的东西。
但是无法理解它们如何在NEST中进行隐式类型转换:
private static QueryBase Combine(QueryBase leftQuery, QueryBase rightQuery, Func<QueryContainer, QueryContainer, QueryContainer> combine)
{
if (IfEitherIsEmptyReturnTheOtherOrEmpty(leftQuery, rightQuery, out var q))
return q;
IQueryContainer container = combine(leftQuery, rightQuery);
var query = container.Bool;
return new BoolQuery
{
Must = query.Must,
MustNot = query.MustNot,
Should = query.Should,
Filter = query.Filter,
};
}
Func<QueryContainer, QueryContainer, QueryContainer> combine
作为参数传递,并且期望QueryContainer
对象作为参数。
但是稍后调用时,我们给类型为QueryBase
的leftQuery对象。
IQueryContainer container = combine(leftQuery, rightQuery);
为什么这样做有效,我在这里想念什么?我找不到QueryContainer
和QueryBase
之间的任何关系。
答案 0 :(得分:3)
正如@ Severius5在评论中所说,答案在第112行:
public static implicit operator QueryContainer(QueryBase query) =>
query == null ? null : new QueryContainer(query);
基本上,它称为隐式用户定义类型转换运算符。非常感谢。
您可以阅读更多documentation
答案 1 :(得分:1)
NEST在多个地方都使用了隐式转换,目的是使API易于使用,同时又利用类型安全性。
通过从QueryContainer
(所有查询继承的基本类型)到QueryBase
的隐式运算符转换,所有查询都隐式转换为QueryContainer
。要了解为什么这样做,请考虑Elasticsearch的JSON DSL中的查询形式
{
"query" : {
"<QUERY TYPE>" : {
// ...
}
}
}
在NEST中,每个QUERY TYPE
都有一个查询类型,它是JSON对象中的字段名称。 QueryContainer
类型表示在其中定义查询的对象。
其他使用隐式转换的地方通常是
string
值,但NEST API希望强加某种形式的验证或专用序列化。