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

C#构造函数和构造对象的类型,c#,.net,constructor,C#,.net,Constructor,有没有一种方法可以让构造器知道在实例f构造中,对象是在什么位置或什么类型中构造的?例如,如果查看以下代码,是否可以将该类型放置在logger类中具有反射的某个位置,以告知创建实例的位置?而不是硬编码的信息 public class MyCollection { private static readonly ILog logger = LogManager.GetLogger("Entities : MyCollection"); } 相反,在我可以打电话的地方做点什么 LogMan

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

public class MyCollection 
{
    private static readonly ILog logger = LogManager.GetLogger("Entities : MyCollection");
}
相反,在我可以打电话的地方做点什么

LogManager.GetLogger();

在Logmanager中,我会在构造函数中知道它是在什么类型中初始化的?通过这种方式,它可以在每个类实例上通用。

您可以定义记录器构造函数,使其具有一个参数(对象obj),并由新记录器创建它(此)

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

这里有两个选项:

  • 使用
    Environment.StackTrace
    。这将为您提供完整的调用堆栈(除非我认为它经过了优化)
  • 将此传递给方法:
对于后者,您可以创建一个扩展方法:

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

另一个避免像这样硬编码名称但也避免使用反射的方法是使用新的C#6
nameof(MyCollection)
语法,它将为你命名为
“MyCollection”
以在重命名后仍然有效的方式


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

它只需要类型名称吗?您将如何处理构造函数中的类型?构建之后,logger根据创建它的类型做了哪些不同的事情?NLog的
LogManager.GetCurrentClassLogger()
正是这样做的(您使用的是NLog吗?:P),检查它的,它使用反射来获取调用方的名称。您应该使用System.Reflection了解创建对象的原因是什么?我希望对其使用反射。所以我可以得到诸如类型名、名称空间等东西。好主意,我想了想。我想知道是否有一些我不知道的隐藏得很深的财产,但这是个好办法。谢谢。是的,我们正在起诉log4net。我只是想知道,完全忽略了明显的日志(这个),然后使用反射来获得我需要的。谢谢大家,很好,谢谢。我不知道“名字”。虽然我希望对对象有更多的控制,但我只想知道类型的名称。