【发布时间】:2019-02-19 23:02:21
【问题描述】:
是否可以基于开放的泛型来解构 serilog 事件数据?例如,我正在尝试这样做:
.Destructure.ByTransforming<CosmosResponse<T>>(
transform =>
new
{
transform.StatusCode,
transform.RequestCharge,
transform.ActivityId,
})
这样我就可以获取任何 Cosmos 响应对象并仅提取应记录的特定信息位。但是,它似乎不起作用 - 我的回调从未被调用。
我还尝试调用ByTransformingWhere 并始终返回true。我很惊讶地看到 每个 日志调用都调用了它,而不仅仅是那些处理 CosmosResponse<T> 的调用。虽然它确实为 Cosmos 响应对象调用了我的谓词,但它仍然没有调用回调来转换对象。
更新
这是迄今为止我所能达到的最好成绩:
.Destructure.ByTransformingWhere<dynamic>(
t => t.IsGenericType && t.GenericTypeArguments.Length == 1 && t.IsSubclassOf(typeof(CosmosResponse<>).MakeGenericType(t.GenericTypeArguments[0])),
r =>
new
{
r.StatusCode,
r.RequestCharge,
r.ActivityId
})
这有点令人担忧,因为 每个 日志调用都会调用谓词,但我找不到任何其他解决方法。
更新 2
在这种情况下,更好的方法是完全避免解构,而是向 Cosmos 客户端添加自定义处理程序。这有助于拦截所有请求,并且我关心的各种信息(状态代码、请求费用等)都存在于响应标头中。
当然,这是特定于 Cosmos DB 的客户端库的,并没有说明原始问题。如果您确实确实需要基于开放的泛型类型进行解构,那么上述方法仍然是 afaik 中最知名的选项。
【问题讨论】: