如何使用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
?
答案 0 :(得分:5)
首先,该方法是私有的,因此只有当前类才会使用它,在这种情况下,可以使用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 here和MethodBase here
上找到更多信息你可以这样做的另一种方法是在要记录的方法上有一个Type参数,并传入你想要记录的Type,但是如果要从外部调用它,则该方法需要是public。类:
public void Log(string logMessage, Type classType)
{
// Log message and class name
}
希望这有帮助。
答案 1 :(得分:3)
你不能没有可用的属性。但是因为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);
}
}
}