NEST(C#)如何隐式转换类型?

时间:2019-01-03 17:46:01

标签: c# nest

我正在寻找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);

为什么这样做有效,我在这里想念什么?我找不到QueryContainerQueryBase之间的任何关系。

2 个答案:

答案 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类型表示在其中定义查询的对象。

其他使用隐式转换的地方通常是

  1. 字段在JSON DSL中可能采用多种不同的格式,因此NEST API通过专用类型公开此字段
  2. JSON DSL可以接受字段的原始值,例如一个string值,但NEST API希望强加某种形式的验证或专用序列化。