【问题标题】:Destructuring open generics with serilog使用 serilog 解构开放泛型
【发布时间】:2019-02-19 23:02:21
【问题描述】:

是否可以基于开放的泛型来解构 serilog 事件数据?例如,我正在尝试这样做:

.Destructure.ByTransforming<CosmosResponse<T>>(
    transform =>
        new
        {
            transform.StatusCode,
            transform.RequestCharge,
            transform.ActivityId,
        })

这样我就可以获取任何 Cosmos 响应对象并仅提取应记录的特定信息位。但是,它似乎不起作用 - 我的回调从未被调用。

我还尝试调用ByTransformingWhere 并始终返回true。我很惊讶地看到 每个 日志调用都调用了它,而不仅仅是那些处理 CosmosResponse&lt;T&gt; 的调用。虽然它确实为 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 中最知名的选项。

【问题讨论】:

    标签: c# generics serilog


    【解决方案1】:

    我希望这样的事情可以完成这项工作:

    .Destructure.ByTransformingWhere<dynamic>(
                        t => t.GetGenericTypeDefinition() == typeof(CosmosResponse<>),
                        o => new { o.Whatever })
    

    作为docs say,虽然:

    解构对象时,转换指定类型的实例 使用提供的函数,如果谓词返回 true。当心 避免谓词中的任何密集工作,因为它可以减慢 管道显着。

    因此,了解如何优化或避免这些反射调用可能是个好主意。

    更新

    要进行正确的智能感知/类型检查,您应该能够做到:

    .Destructure.ByTransformingWhere<CosmosResponse<object>>(
        t => t.IsGenericType && t.GenericTypeArguments.Length == 1 && t.IsSubclassOf(typeof(CosmosResponse<>).MakeGenericType(t.GenericTypeArguments[0])),
        r =>
            new
            {
                r.StatusCode,
                r.RequestCharge,
                r.ActivityId
            })
    

    (即提供 CosmosResponse&lt;object&gt; 作为类型参数而不是 dynamic ,以便 CosmosResponse 上存在的属性亮起)

    【讨论】:

    • 谢谢 - 我用我得到的解决方案更新了我的问题。希望它在现实世界中不会被证明是不切实际的。
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多