You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Serilog Destructure.ByTransforming<Interface>() 失效问题求助

解决Serilog自动解构接口实现类的问题

这个问题我之前也碰到过!Serilog的Destructure.ByTransforming<T>是按编译时静态类型来匹配规则的,不是看对象的运行时类型是否实现了目标接口。你代码里的new Test()编译时类型是Test,不是ITest,所以接口对应的转换逻辑根本不会被触发,这就是为什么没得到预期输出的原因。

正确的解决方案:使用ByTransformingWhere

Serilog提供了ByTransformingWhere方法,它可以通过条件判断(比如检查对象是否实现了指定接口)来匹配所有符合要求的对象,不管它的编译时类型是什么。修改后的代码如下:

public interface ITest { }
public class Test : ITest { }
public class Program {
    public static int Main(string[] args) {
        Log.Logger = new LoggerConfiguration()
            // 匹配所有实现了ITest接口的对象
            .Destructure.ByTransformingWhere(
                obj => obj is ITest,
                obj => new { str = "Blah" }
            )
            .CreateLogger();
        Log.Logger.Debug("We have issues with {@test}", new Test());
    }
}

为什么这个方法有效?

ByTransformingWhere的第一个参数是一个判断条件,只要对象满足obj is ITest(也就是运行时类型实现了ITest接口),就会执行第二个参数里的转换逻辑,把对象解构为你定义的匿名类型。这样不管你传入的是Test还是其他任何ITest的实现类,都会被自动解构,完全符合你“无需手动逐个添加”的需求。

运行修改后的代码,日志输出就会是你预期的{str="Blah"}啦!

内容的提问来源于stack exchange,提问作者Cory-G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:09:45