当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何找到当前函数调用者的对象实例的类型?》经验,为你挑选了0个好方法。

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

class MessageReceiver
{
     protected ILog Log = Util.CreateLog();
     ...
}

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

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

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

class IMReceiver : MessageReceiver
{ ... }

class EmailReceiver : MessageReceiver
{ ... }

这两个类的实例将获得与名称"的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 + "-" + GetAndInstanceCountFor(type));
        }
}

我更喜欢编写ILog Log = Util.CreateLog(); 而不是每当我写一个新类时,从其他文件中复制一些长的神秘线.我知道,在Util.CreateLog使用的反射不能保证工作,虽然 - 是System.Reflection.MethodBase.GetCurrentMethod()保证工作?

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有