从静态类调用方法,传递带有泛型的动态变量类型

发布于 2024-11-16 10:14:40 字数 429 浏览 3 评论 0原文

我如何从静态类中调用在泛型中传递动态类型的方法。 这是我的静态类:

public static class Log<T>
{
    private readonly static ILog Logger = LogManager.GetLogger(typeof(T));

    public static void LogInfo(string message)
    {
        Logger.Info(message);
    }
}

我想这样调用 LogInfo:

Log<myObject.GetType()>.LogInfo("Some String");

我的问题是如何在 Generic 中传递 myObject 的类型,因为这个对象的类型是动态的。

How can i call a method from a static class passing a type of dynamic in generic.
Here is my static class:

public static class Log<T>
{
    private readonly static ILog Logger = LogManager.GetLogger(typeof(T));

    public static void LogInfo(string message)
    {
        Logger.Info(message);
    }
}

I want to call LogInfo like this:

Log<myObject.GetType()>.LogInfo("Some String");

My question is about how to pass a type of myObject in Generic, because the type of this object is dynamic.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

是伱的 2024-11-23 10:14:40

我想这样调用 LogInfo:

Log<myObject.GetType()>.LogInfo("Some String");

为什么?为什么不这样做:

public static class Log {
     private static readonly Dictionary<Type, ILog> loggers =
         new Dictionary<Type, ILog>();

     public static void LogInfo(Type type, string message) {
          var logger = Log.GetLoggerForType(type);
          logger.Info(message);
     }

     public static void LogInfo<T>(string message) {
          LogInfo(typeof(T), message);
     }

     private static ILog GetLoggerForType(Type type) {
          ILog logger;
          if(!loggers.TryGetValue(type, out logger)) {
               logger = LogManager.GetLogger(type);
               loggers.Add(type, logger);
          }
          return logger;
     }
}

请注意,这不是、不是、不是线程安全的。我想传达这个想法。

然后:

Log<myObject.GetType()>.LogInfo("Some String");

可以替换为,

Log.LogInfo(myObject.GetType(), "Some String");

或者您甚至可以更进一步,添加一个允许您说的重载

Log.LogInfo(myObject, "Some String");

(只需在 LogInfo 中调用 object.GetType)。

I want to call LogInfo like this:

Log<myObject.GetType()>.LogInfo("Some String");

Why? Why don't you just do this:

public static class Log {
     private static readonly Dictionary<Type, ILog> loggers =
         new Dictionary<Type, ILog>();

     public static void LogInfo(Type type, string message) {
          var logger = Log.GetLoggerForType(type);
          logger.Info(message);
     }

     public static void LogInfo<T>(string message) {
          LogInfo(typeof(T), message);
     }

     private static ILog GetLoggerForType(Type type) {
          ILog logger;
          if(!loggers.TryGetValue(type, out logger)) {
               logger = LogManager.GetLogger(type);
               loggers.Add(type, logger);
          }
          return logger;
     }
}

Note that this is not, Not, NOT thread safe. I wanted to communicate the idea.

Then:

Log<myObject.GetType()>.LogInfo("Some String");

can be replaced by

Log.LogInfo(myObject.GetType(), "Some String");

or you can even go one step further and add an overload that allows you to say

Log.LogInfo(myObject, "Some String");

(just call object.GetType in LogInfo).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文