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 })
};
}
}