Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个.NET类关于它的名称有哪些信息?_.net_Class_Assemblies - Fatal编程技术网

一个.NET类关于它的名称有哪些信息?

一个.NET类关于它的名称有哪些信息?,.net,class,assemblies,.net,Class,Assemblies,我正在构建一个类项目(单独的dll),它将包含各种帮助器方法和通用功能,可以被一系列不同的应用程序访问——ASP.NET网站、web服务和Windows服务 这个中立类有没有办法确定调用它的应用程序的类型(例如,它可以选择如何记录信息) 对于一个类来说,还有哪些关于调用它的应用程序的“元”信息呢?一个类不应该知道它是如何被使用的。记住它是一个黑盒子 如果要向类公开日志记录,请在构造函数或方法中创建传递给类的日志记录接口 然后,每个调用应用程序都可以实现自己版本的记录器,并且日志实现可以包含您要查

我正在构建一个类项目(单独的dll),它将包含各种帮助器方法和通用功能,可以被一系列不同的应用程序访问——ASP.NET网站、web服务和Windows服务

这个中立类有没有办法确定调用它的应用程序的类型(例如,它可以选择如何记录信息)


对于一个类来说,还有哪些关于调用它的应用程序的“元”信息呢?

一个类不应该知道它是如何被使用的。记住它是一个黑盒子

如果要向类公开日志记录,请在构造函数或方法中创建传递给类的日志记录接口


然后,每个调用应用程序都可以实现自己版本的记录器,并且日志实现可以包含您要查找的详细信息。并且该类将仅使用接口来记录消息、日志错误等

如果您使用日志框架,如NLog或Log4Net,那么您在客户端应用程序中配置日志的方式。在共享库中,您只需使用记录器,而不必考虑日志条目的保存方式(文件、事件日志、邮件等)。

您可以通过查看堆栈跟踪来获取信息:

StackTrace stackTrace = new StackTrace();            // Get call stack
StackFrame[] stackFrames = stackTrace.GetFrames();   // Get method calls (frames)
string methodName = stackFrames[0].GetMethod().Name; // Get method name
string type = stackFrames[0].GetType().ToString();   // Get the calling type
然而,我认为更好的解决方案是使用更面向对象的方法。创建实现相同接口的不同记录器。根据创建和使用类的内容,将记录器的实例传递给类

public interface ILogger 
{
    void Log(string message);
}

public class MyWorkerClass
{
    private ILogger m_Logger;

    public MyWorkerClass(ILogger logger)
    {
        m_Logger = logger;
    }

    public void Work()
    {
        m_Logger.Log("working")
    }

    // add other members...
}

public class MyService
{
    public void DoSomething()
    {
        ILogger logger = new MyServiceLogger();
        MyWorkerClass worker = new MyWorkerClass(logger);
        worker.Work();
    }
}

虽然到目前为止我完全同意这里的答案,但是您可以获得有关加载模块的反射信息,结合堆栈跟踪,您可以找出调用代码的函数和类,并获得相应的反射信息


但是,重申一下,我同意其他帖子的观点,您应该通过一个接口来抽象它,因为这向其他程序员明确了如何使用数据,并减少了由于误解而引入错误的机会。(恕我直言,反射实际上应该只用于序列化和直接由属性控制的显式操作,例如.Net中的GUI编辑器)

您的设计。有点不对劲


通过使用,将这些“如果是a X do it Y,如果是a do it B”选项考虑在内。那些在不同上下文中发生变化的行为应该封装到实现公共接口的对象中。调用方将确定他希望您使用的接口的实现,并在调用您的方法之前将其注入实例。

很高兴看到有人回答了问题。如果他问了如何射中自己的脚,应该回答所问的问题吗?谢谢!我将修改我的设计,以使用接口,但我想知道如何射自己的脚无论如何-可能在更奇怪的情况下有用。