Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用serilog解构开放泛型_C#_Generics_Serilog - Fatal编程技术网

C# 用serilog解构开放泛型

C# 用serilog解构开放泛型,c#,generics,serilog,C#,Generics,Serilog,是否可以基于开放的泛型数据来分解serilog事件数据?例如,我正在尝试这样做: .Destructure.ByTransforming<CosmosResponse<T>>( transform => new { transform.StatusCode, transform.RequestCharge, transform.ActivityId,

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

.Destructure.ByTransforming<CosmosResponse<T>>(
    transform =>
        new
        {
            transform.StatusCode,
            transform.RequestCharge,
            transform.ActivityId,
        })
这有点令人担忧,因为每次日志调用都会调用谓词,但我找不到其他解决方法

更新2 在本例中,更好的方法是避免完全破坏结构,而是向Cosmos客户端添加自定义处理程序。这有助于拦截所有请求,我关心的各种信息(状态代码、请求费用等)都存在于响应头中


当然,这是Cosmos DB的客户端库特有的,并没有说明原始问题。如果您确实需要基于开放泛型类型来分解结构,那么以上仍然是afaik最著名的选项。

我希望类似的方法可以完成这项工作:

.Destructure.ByTransformingWhere(
t=>t.GetGenericTypeDefinition()==typeof(CosmosResponse),
o=>new{o.Whatever})
然而,作为一个例子:

在分解对象时,转换指定类型的实例 使用提供的函数,如果谓词返回true。小心 避免谓词中的任何密集工作,因为它会减慢 管道显著受损

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

更新

要进行适当的intellisense/类型检查,您应该能够执行以下操作:

.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
        })
.Destructure.ByTransformingWhere(
t=>t.IsGenericType&&t.GenericTypeArguments.Length==1&&t.IsubClassof(typeof(CosmosResponse).MakeGenericType(t.GenericTypeArguments[0]),
r=>
新的
{
r、 状态码,
r、 请求收费,
r、 活动ID
})

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

谢谢-我用我得出的解决方案更新了我的问题。希望它在现实世界中不会被证明是不切实际的。
.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
        })