小编not*_*tso的帖子

如何找到当前函数调用者的对象实例的类型?

目前我有一个函数CreateLog()用于在构造实例的类之后创建一个带有名称的log4net日志.通常用于:

class MessageReceiver
{
     protected ILog Log = Util.CreateLog();
     ...
}
Run Code Online (Sandbox Code Playgroud)

如果我们删除了大量的错误处理,实现归结为:[编辑:请在本文中进一步阅读更长版本的CreateLog.]

public ILog CreateLog()
{
        System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(1);
        System.Reflection.MethodBase method = stackFrame.GetMethod();
        return CreateLogWithName(method.DeclaringType.FullName);
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我们将MessageReceiver置于子类中,则日志仍将从MessageReceiver获取其名称,因为这是调用CreateLog的方法(构造函数)的声明类.

class IMReceiver : MessageReceiver
{ ... }

class EmailReceiver : MessageReceiver
{ ... }
Run Code Online (Sandbox Code Playgroud)

这两个类的实例将获得与名称"的messageReceiver"日志,而我想他们是赐名"IMReceiver"和"EmailReceiver".

我知道这很容易通过调用CreateLog时,因为对对象对GetType()方法,我想要做什么创作传递一个参考对象来完成(并完成).

有一些小的理由不喜欢不添加参数,个人感到不安,因为没有找到没有额外参数的解决方案.

是否有人可以告诉我如何实现零参数CreateLog()从子类而不是声明类获取名称?

编辑:

CreateLog函数比上面提到的更多.每个实例有一个日志的原因是能够在日志文件中的不同实例之间有所不同.这由CreateLog/CreateLogWithName对强制执行.

扩展CreateLog()的功能以激发其存在.

public ILog CreateLog()
{
        System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(1);
        System.Reflection.MethodBase method = stackFrame.GetMethod();
        Type type = method.DeclaringType;

        if (method.IsStatic)
        {
            return CreateLogWithName(type.FullName);
        }
        else
        {
            return CreateLogWithName(type.FullName + "-" + …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection logging

7
推荐指数
1
解决办法
2931
查看次数

标签 统计

.net ×1

c# ×1

logging ×1

reflection ×1