NEST (C#) 如何隐式转换类型?
How does NEST (C#) implicitly convert types?
我正在查看 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);
为什么这有效,我在这里缺少什么?我找不到 QueryContainer
和 QueryBase
之间的任何关系。
正如@Severius5 在评论中所说,答案在第 112 行:
public static implicit operator QueryContainer(QueryBase query) =>
query == null ? null : new QueryContainer(query);
基本上,它调用了隐式用户自定义类型转换运算符。非常感谢。
你可以阅读更多documentation
NEST 在多个地方使用隐式转换,目的是使 API 易于使用,同时利用类型安全。
所有查询都通过从 QueryBase
(所有查询继承自的基本类型)到 QueryContainer
的隐式运算符转换隐式转换为 QueryContainer
。要理解这样做的原因,请考虑 Elasticsearch 的 JSON DSL
中的查询形式
{
"query" : {
"<QUERY TYPE>" : {
// ...
}
}
}
在 NEST 中,每个 QUERY TYPE
都有一个查询类型,它是 JSON 对象中的字段名称。 QueryContainer
类型表示定义查询的对象。
其他使用隐式转换的地方通常是where
- 一个字段在 JSON DSL 中可以采用多种不同的格式,因此 NEST API 通过专门的类型公开它
- JSON DSL 可以接受字段的原始值,例如
string
值,但 NEST API 希望强加某种形式的验证或专门的序列化。
我正在查看 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
.
IQueryContainer container = combine(leftQuery, rightQuery);
为什么这有效,我在这里缺少什么?我找不到 QueryContainer
和 QueryBase
之间的任何关系。
正如@Severius5 在评论中所说,答案在第 112 行:
public static implicit operator QueryContainer(QueryBase query) =>
query == null ? null : new QueryContainer(query);
基本上,它调用了隐式用户自定义类型转换运算符。非常感谢。
你可以阅读更多documentation
NEST 在多个地方使用隐式转换,目的是使 API 易于使用,同时利用类型安全。
所有查询都通过从 QueryBase
(所有查询继承自的基本类型)到 QueryContainer
的隐式运算符转换隐式转换为 QueryContainer
。要理解这样做的原因,请考虑 Elasticsearch 的 JSON DSL
{
"query" : {
"<QUERY TYPE>" : {
// ...
}
}
}
在 NEST 中,每个 QUERY TYPE
都有一个查询类型,它是 JSON 对象中的字段名称。 QueryContainer
类型表示定义查询的对象。
其他使用隐式转换的地方通常是where
- 一个字段在 JSON DSL 中可以采用多种不同的格式,因此 NEST API 通过专门的类型公开它
- JSON DSL 可以接受字段的原始值,例如
string
值,但 NEST API 希望强加某种形式的验证或专门的序列化。