Serilog Destructure.ByTransforming <interface>()无效

时间:2018-05-04 21:34:40

标签: c# serilog

我希望Serilog能够构建任何实现界面的类(因此我不必手动将它们全部包含在内)。以下内容似乎不起作用:

public interface ITest { }

public class Test : ITest { }

public class Program
{
    public static int Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .Destructure.ByTransforming<ITest>(i => new { str = "Blah" })
            .CreateLogger();

        Log.Logger.Debug("We have issues with {@test}", new Test());
    }
}

我得到{str="Blah"}而不是像对待类解析那样获得{} 是否有一个技巧可以解决所有实现接口的解构?

1 个答案:

答案 0 :(得分:0)

我找到了一种方法。我在网上找不到任何文档或示例,但是我喋喋不休并想出如何使用解构策略。只需创建一个继承自IDestructuringPolicy的类并实现TryDestructure方法。作为TryDestructure的参数,您将获得要被解构的值,可以用于构造结果的工厂对象,最后一个参数是结果的输出参数。如果解构成功,则函数应返回true,否则返回false

我创建了一个解析传入对象类型的解构策略。如果它与我想要的接口类型匹配,我会像正常一样对其进行解构并返回true。

以下是我创建的一个示例:

 public class ResponseDestructuringPolicy : IDestructuringPolicy
 {
   public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, out LogEventPropertyValue result)
   {
     if (value is IResponse response)
     {
       result = propertyValueFactory.CreatePropertyValue( new {response.Message} );
       return true;
     }

     result = null;
     return false;
   }
}

然后在创建时将其挂钩到记录器,如下所示:

 Log.Logger = new LoggerConfiguration()
     .Destructure.With(new ResponseDestructuringPolicy())
     .CreateLogger();

Destructure.With()功能可以根据需要采用多种策略。看起来Serilog会检查注册类型的结构,然后它会遍历每个策略并在每个策略上运行TryDestructure函数,直到它获得true。如果没有收到true,它将继续构造默认方式。