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

本文关键字:对象 类型 构造函数 | 更新日期: 2023-09-27 18:19:52

有没有一种方法可以让构造函数知道在实例f构造的哪里或在什么类型中构造对象?例如,如果您查看以下代码,是否可以将该类型放置在记录器类内部具有反射的某个位置,以告知实例是在哪里创建的?而不是对信息进行硬编码。

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

相反,做一些我可以称之为的事情

LogManager.GetLogger();

在日志日志管理器中,我会知道在构造函数中它是在什么类型中初始化的?这样它就可以被通用,并且可以在每个类实例上使用。

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

您可以将Logger构造函数定义为具有参数(Object obj),并通过新的Logger(this)创建它。

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

另一个避免像这样对名称进行硬编码但也避免使用反射的选项是使用新的C#6 nameof(MyCollection)语法,该语法将以一种能够经受重命名的方式为您提供名称"MyCollection"

这并不是你想要的,但它是一种干净、重构安全、高效的方式,可以将名称传递给这样的静态记录器。

这里有两个选项:

  • 使用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记录器可用。我宁愿使用其中一个,也不愿自己制作一个,因为在某个时候你会遇到并发问题之类的问题。