Akka.Interfaced.LogFilter.LogProxyBuilder.GetLogProxyTemplate C# (CSharp) Method

GetLogProxyTemplate() private static method

private static GetLogProxyTemplate ( Type loggerType, object>.Func loggerAccessor, string logLevel ) : LogProxy.Template
loggerType System.Type
loggerAccessor object>.Func
logLevel string
return LogProxy.Template
        private static LogProxy.Template GetLogProxyTemplate(Type loggerType, Func<object, object> loggerAccessor, string logLevel)
        {
            const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

            // Find property whose signature is "bool Is{logLevel}Enabled"

            var isEnabledPi = loggerType.GetProperties(bindingFlags).FirstOrDefault(
                p => p.Name == $"Is{logLevel}Enabled");

            if (isEnabledPi == null)
            {
                throw new InvalidOperationException(
                    $"Cannot find Is{logLevel}Enabled property from {loggerType.FullName}");
            }

            // Find method whose signature is "void {logLevel}(string or object)"

            var logMi = loggerType.GetMethods(bindingFlags).FirstOrDefault(
                m => m.Name == logLevel &&
                     m.GetParameters().Length == 1 &&
                     m.GetParameters()[0].ParameterType == typeof(string));

            if (logMi == null)
            {
                logMi = loggerType.GetMethods(bindingFlags).FirstOrDefault(
                    m => m.Name == logLevel &&
                         m.GetParameters().Length == 1 &&
                         m.GetParameters()[0].ParameterType == typeof(object));

                if (logMi == null)
                {
                    throw new InvalidOperationException(
                            $"Cannot find {logLevel} method from {loggerType.FullName}");
                }
            }

            return new LogProxy.Template
            {
                IsEnabledMethod = actor => (bool)isEnabledPi.GetValue(loggerAccessor(actor)),
                LogMethod = (actor, message) => logMi.Invoke(loggerAccessor(actor), new object[] { message })
            };
        }
    }