一个函数如何产生多个函数?

时间:2018-04-09 22:20:55

标签: c# .net visual-studio azure-functions

我目前正在使用Azure Functions,我刚刚找到了这个接口定义。

Assembly Microsoft.Extensions.Logging.Abstractions, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60

using System;

namespace Microsoft.Extensions.Logging
{
    public interface ILogger
    {
        IDisposable BeginScope<TState>(TState state);

        bool IsEnabled(LogLevel logLevel);

        void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter);
    }
}

我对void Log<TState>特别感兴趣。这个函数具有看似通用的功能,但似乎神奇地扩展为6个函数。

log.LogCritical("...");
log.LogDebug("...");
log.LogError("...");
log.LogInformation("...");
log.LogTrace("...");
log.LogWarning("...");

我通过Azure功能定义接收了对日志的引用。

[FunctionName("WhoAmI")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req, ILogger log)
{ ... }

Microsoft samplesdocumentation反映了这一点。

我猜这是一个C#或Visual Studio功能,而不是巫术,但它的功能是什么?

1 个答案:

答案 0 :(得分:4)

这是名为扩展方法的C#功能。这些方法在LoggerExtensions静态类中定义。这是一个示例签名:

public static void LogDebug (
    this ILogger logger, EventId eventId, string message, object[] args);

关键字this使得调用看起来像是接口的成员。

LoggerExtensions class

C# Extension methods

致@SirRufo在评论中提供正确的提示。我不想在没有完整答案的情况下离开这个问题:)