有没有办法允许构造函数知道实例f构造的哪个或哪个类型,该对象是在其中构造的?例如,如果您查看以下代码,是否可以将类型放在记录器类中的反射位置,以告知实例的创建位置?而不是硬编码信息。
public class MyCollection
{
private static readonly ILog logger = LogManager.GetLogger("Entities : MyCollection");
}
相反,做一些我可以打电话的地方
LogManager.GetLogger();
在日志Logmanager中,我会在构造函数中知道它在哪个类型中被初始化?通过这种方式,它可以在每个类实例上使用。
答案 0 :(得分:3)
您可以将Logger构造函数定义为具有参数(Object obj)并使用新的Logger(this)创建它。
然后您可以使用GetType()。Name来确定对象的类型。
答案 1 :(得分:2)
另一个避免硬编码这样的名称但也避免使用反射的选项是使用新的C#6 nameof(MyCollection)
语法,它将以重命名的方式为您提供名称"MyCollection"
。
它并不完全是您所要求的,但它是一种干净,重构安全,有效的方式将名称传递给这样的静态记录器。
答案 2 :(得分:1)
以下是两个选项:
Environment.StackTrace
。这将为您提供完整的调用堆栈(除非我认为它已经过优化)。this
传递给方法:对于后者,您可以创建一个扩展方法:
public static class MyLogger
{
public static void Log(this object o, string format, params object[] par)
{
string typeName = o.GetType().Name;
string msg = string.Format(format, par);
// Pass to logger
}
}
像这样使用:
this.Log("foo {0}", 12);
注意:强>
已经有很多优秀的.NET记录器可用。我宁愿使用其中一个而不是自己制作一个,因为在某些时候你会遇到并发问题和类似的东西。