В настоящее время у меня есть функция CreateLog () для создания журнала log4net с именем после класса создаваемого экземпляра.
Обычно используется как в:
class MessageReceiver
{
protected ILog Log = Util.CreateLog();
...
}
Если мы удалим много ошибок обработки, реализация сводится к:
[РЕДАКТИРОВАТЬ: Пожалуйста, прочитайте более длинную версию CreateLog далее в этом посте.]
public ILog CreateLog()
{
System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(1);
System.Reflection.MethodBase method = stackFrame.GetMethod();
return CreateLogWithName(method.DeclaringType.FullName);
}
Проблема в том, что если мы переименуем MessageReceiver в подклассы, журнал все равно получит свое имя от MessageReceiver, поскольку это объявленный класс метода (конструктора), который вызывает CreateLog.
class IMReceiver : MessageReceiver
{ ... }
class EmailReceiver : MessageReceiver
{ ... }
Экземпляры обоих этих классов получат журналы с именем «MessageReceiver», в то время как я хотел бы, чтобы им были присвоены имена «IMReceiver» и «EmailReceiver».
Я знаю, что это легко сделать (и сделать), передав ссылку на объект в процессе создания при вызове CreateLog, поскольку метод GetType () для объекта делает то, что я хочу.
Есть несколько незначительных причин, чтобы предпочесть не добавлять параметр, и лично меня беспокоит то, что я не нашел решения без лишних аргументов.
Есть ли кто-нибудь, кто может показать мне, как реализовать нулевой аргумент CreateLog (), который получает имя из подкласса, а не декларирующий класс?
EDIT:
Функция CreateLog делает больше, чем упомянуто выше. Причиной наличия одного журнала на экземпляр является возможность различаться между различными экземплярами в файле журнала. Это обеспечивается парой CreateLog / CreateLogWithName.
Расширение функциональности CreateLog () для мотивации его существования.
public ILog CreateLog()
{
System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(1);
System.Reflection.MethodBase method = stackFrame.GetMethod();
Type type = method.DeclaringType;
if (method.IsStatic)
{
return CreateLogWithName(type.FullName);
}
else
{
return CreateLogWithName(type.FullName + "-" + GetAndInstanceCountFor(type));
}
}
Также я предпочитаю писать ILog Log = Util.CreateLog (); вместо того, чтобы копировать какую-то длинную загадочную строку из другого файла всякий раз, когда я пишу новый класс. Я знаю, что отражение, используемое в Util.CreateLog, не гарантируется, хотя - гарантированно работает System.Reflection.MethodBase.GetCurrentMethod ()?