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

4
我正在研究用于 Elasticsearch 的 NEST 库,尝试创建类似的东西。
但是我不明白他们如何在 QueryBase.cs 中进行隐式类型转换:
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之间的任何关系。


4
请查看QueryBase中的第112行。 - Severius5
@Severius5,非常感谢,这就是答案。我从未使用过这种类型的运算符重载,真的很酷。 - AntonIva
@AntonIva 从问题中删除答案并在下面回答。保持问题和答案分开。您可以稍后接受自己的答案并获得声望。 - user47589
谢谢@Amy。我按照你说的做了。 - AntonIva
这就是了。欢迎来到 Stack Overflow。大约两个小时后您应该能够接受您的答案。 - user47589
2个回答

4

正如@Severius5在评论中所说,答案在第112行:

public static implicit operator QueryContainer(QueryBase query) =>
            query == null ? null : new QueryContainer(query);

基本上,它被称为“隐式用户定义类型转换运算符”。非常感谢。
您可以阅读更多文档

1
NEST在多个地方使用隐式转换,旨在使API易于使用,同时利用类型安全性。
所有查询都通过从QueryBase(所有查询继承的基本类型)到QueryContainer的隐式操作符转换,隐式转换为QueryContainer。要理解为什么要这样做,请考虑Elasticsearch的JSON DSL中查询的形式。
{
    "query" : {
        "<QUERY TYPE>" : {
            // ...
        }
    }
}

在NEST中,每个查询类型都有一个查询类型,这是JSON对象中的字段名。 QueryContainer类型表示定义了查询的对象。
其他隐式转换使用的地方通常是:
  1. 字段可以在JSON DSL中采用多种不同的格式,因此NEST API通过专门的类型公开此功能。
  2. JSON DSL可能会接受一个字段的原始值,例如string值,但NEST API希望强制执行某种形式的验证或专门的序列化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接