2015-10-29 27 views
3

有没有一种方法可以让构造函数知道在实例f构造的哪个类型中,该对象是在内部构造的?例如,如果你查看下面的代码,类型是否可以放在记录器类中的反射的某个地方,告诉实例的创建位置?而不是硬编码的信息。C#的构造函数和构造对象的类型

public class MyCollection 
{ 
    private static readonly ILog logger = LogManager.GetLogger("Entities : MyCollection"); 
} 

相反,做事情的地方,我可以只叫

LogManager.GetLogger(); 

和LOG日志管理中,我会是什么类型它是内初始化的构造函数中知道吗?这样它可以一般使用,并在每个类实例上。

+0

它只需要类型名称?你将如何处理构造函数中的类型?施工后,根据创建它的类型,记录器的做法会有所不同? – CoderDennis

+1

NLog的'LogManager.GetCurrentClassLogger()'确实如此(你是否使用NLog?:P),检查它的[源代码(在LogManager.GetClassFullName()方法中定义)](https://github.com/NLog/ NLog/blob/master/src/NLog/LogManager.cs#L379),它使用Reflection获取调用者的名称。 – KurzedMetal

+2

您应该使用System.Reflection – billybob

回答

3

您可以定义Logger构造函数以使其具有参数(Object obj)并由新Logger(this)创建它。

然后,您可以使用GetType()。Name来确定对象的类型。

+0

伟大的想法,我虽然这一点。想知道是否有一些我不知道的深藏不露的财产,但这是一个好方法。谢谢。 – Casey

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

注:

Ther e已经有很多优秀的.NET记录器可用。我宁愿使用其中的一个,而不是自己创建一个,因为在某些时候,你会碰到并发问题和类似的东西。

+0

是的,我们目前正在起诉log4net。我只是想知道,并完全忽略了明显的日志(这个),然后使用反射来获得我所需要的。感谢大家。 – Casey

2

避免硬编码这样的名称,但也避免使用反射的另一种选择是使用新的C#6 nameof(MyCollection)语法,它将以重命名后不会出现的名称"MyCollection"

这不完全是你要求的,但它是一个干净的,重构安全的,有效的方式将名称传递给这样的静态记录器。

+0

不错,谢谢。不知道“nameof”。虽然我想要更多的控制对象,那么只是类型的名称。 – Casey