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