C#构造函数和构造对象的类型

时间:2015-10-29 19:20:27

标签: c# .net constructor

有没有办法允许构造函数知道实例f构造的哪个或哪个类型,该对象是在其中构造的?例如,如果您查看以下代码,是否可以将类型放在记录器类中的反射位置,以告知实例的创建位置?而不是硬编码信息。

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

相反,做一些我可以打电话的地方

LogManager.GetLogger();

在日志Logmanager中,我会在构造函数中知道它在哪个类型中被初始化?通过这种方式,它可以在每个类实例上使用。

3 个答案:

答案 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记录器可用。我宁愿使用其中一个而不是自己制作一个,因为在某些时候你会遇到并发问题和类似的东西。