gpt4 book ai didi

c# - 将 Func 重铸为特定委托(delegate)

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:23 25 4
gpt4 key购买 nike

我正在利用 NLog 的能力将委托(delegate)而不是字符串作为日志调用的一部分。例如

log.Error(()=>"I am an error which was encountered at " + DateTime.Now)

只有在启用日志记录的情况下才会评估此委托(delegate)。从理论上讲,它允许更快的执行,因为委托(delegate)并不总是被评估。漂亮。

当我像优秀的第 3 方库消费者一样包装 NLog 记录器时,我的问题就开始了。我有一个像

这样的界面
public interface ILog
{
...
void Error(string errorMessage, params string[] args);
void Error(Func<string> messageGenerator);
void Error(Exception excepetion, string errorMessage, params string[] args);
void Error(Exception excepetion, Func<string> messageGenerator);
...
}

然后像这样的实现

...

public void Error(Func<string> messageGenerator)
{
//_log is an NLog logger
_log.Error((LogMessageGenerator) messageGenerator);
}
....

我的问题是在我的错误日志中没有评估 lambda。我玩了一下,我认为问题在于,当 Func 首次创建时,它被简单地创建为 Func,然后当它被传递到 NLog 时,它被作为传递而不是 LogMessageGenerator。调用接受对象的 NLog 重载。所以我猜测,在编译 lambda 时,C# 编译器会尝试根据上下文静态键入它们的返回值。

 //log is raw nlog logger
log.Error(()=> "I am a terrible error"); => LogMessageGenerator
//log is my wrapper
log.Error(()=> "I am an even more terrible error"); => Func<string>

有什么方法可以构建我的 ILog 实现,使其仍然调用正确的 NLog 重载,而无需通过更改方法签名以采用 LogMessageGenerator 来显式依赖我的接口(interface)中的 NLog?我天真地尝试将我的 Func 转换为 LogMessageDelegate,但这是不行的。

最佳答案

尝试

public void Error(Func<string> messageGenerator)
{
//_log is an NLog logger
_log.Error(new LogMessageGenerator(messageGenerator));
}

关于c# - 将 Func 重铸为特定委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18242985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com