Получение имени класса
Как получить class-name
с caller info attributes
,
я strongly say a no
войти имя класса с помощью отражения.
Был в состоянии получить имя метода, используя [CallerMemberName]
как ниже:
private void Log(string logMessage, [CallerMemberName]string callerName = null)
{
if (logger.IsDebugEnabled)
{
logger.DebugFormat("Executing Method = {1};{0}", logMessage, callerName);
}
}
Как войти class name
здесь, используя Атрибуты Caller Info?
2 ответа
Вы не можете найти доступный атрибут, который это делает. Однако, потому что Log
является закрытым, никакие внешние классы не могут вызывать функцию, поэтому вы уже знаете, какой класс вызвал ее.
public SomeClass
{
//(snip)
private void Log(string logMessage, [CallerMemberName]string callerName = null)
{
if (logger.IsDebugEnabled)
{
string className = typeof(SomeClass).Name;
logger.DebugFormat("Executing Method = {1};{2}.{0}", logMessage, callerName, className);
}
}
}
Прежде всего, метод является закрытым, поэтому его будет использовать только текущий класс, и в этом случае его можно найти с помощью typeof(T).FullName
или же typeof(T).Name
имущество.
Здесь вы также можете попробовать программно узнать имя класса из фрейма стека, которое будет работать для других классов, если метод будет общедоступным, как показано ниже:
private void Log(string logMessage)
{
StackFrame frame = new StackFrame(1, false);
MethodBase method = frame.GetMethod();
Type declaringType = method.DeclaringType;
// Log declaringType.FullName or other property
}
Вы можете найти больше информации о StackFrame здесь и MethodBase здесь
Другой способ, которым вы могли бы сделать это, это иметь параметр Type в методе для регистрации и передать тип, который вы хотите зарегистрировать, однако метод должен быть общедоступным, если его нужно вызывать извне этого класса:
public void Log(string logMessage, Type classType)
{
// Log message and class name
}
Надеюсь это поможет.