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
相关产品推荐
相关产品推荐

