我希望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"}
而不是像对待类解析那样获得{}
是否有一个技巧可以解决所有实现接口的解构?
答案 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
,它将继续构造默认方式。