【问题标题】:Accessing a method from a static routine c#从静态例程 c# 访问方法
【发布时间】:2013-10-25 08:43:20
【问题描述】:

我有一个方法

 private string sLogFormat;
        private string sErrorTime;

        public void CreateLogFile(string path, string msg)
        { 
            //sLogFormat used to create log files format :
            // dd/mm/yyyy hh:mm:ss AM/PM ==> Log Message
            sLogFormat = DateTime.Now.ToShortDateString().ToString() + " " + DateTime.Now.ToLongTimeString().ToString() + " ==> ";

            //this variable used to create log filename format "
            //for example filename : ErrorLogYYYYMMDD
            string sYear = DateTime.Now.Year.ToString();
            string sMonth = DateTime.Now.Month.ToString();
            string sDay = DateTime.Now.Day.ToString();
            sErrorTime = sYear + sMonth + sDay;

            StreamWriter sw = new StreamWriter(path + sErrorTime, true);
            sw.WriteLine(sLogFormat + msg);
            sw.Flush();
            sw.Close();

        }

另一个触发 Onchanged 处理程序某处的方法 run()(它在更精确地更改文件夹内容时触发) 这里

 public static void Run()
        {
            // Create a new FileSystemWatcher and set its properties.
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = "C:/model_RCCMREC";

            /* Watch for changes in LastAccess and LastWrite times, and
               the renaming of files or directories. */
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            //   watch wav files.
            watcher.Filter = "*.wav";

            // Add event handlers. 
            watcher.Created += new FileSystemEventHandler(OnChanged);

            // Begin watching.
            watcher.EnableRaisingEvents = true;
        }

和 OnChanged 处理程序作为

public static  void OnChanged(object source, FileSystemEventArgs e)
        {  
            try
            { 

                //access last folder(newly created one is suposedly at last position)
                var directory = new DirectoryInfo("C:/model_RCCMREC");
                var myFile = (from f in directory.GetFiles() orderby f.LastWriteTime descending select f).First();

                //2.Split the file name.
            }


            catch
            {
//I WANT TO ACCESS THE METHOD CreateLogFile(x,y) HERE

            }
        }

我无法从 OnChanged 处理程序中正常访问 CreateLogFile() 方法。如何访问它?

【问题讨论】:

  • OnChanged 处理程序是否与CreateLogfile 函数属于同一类?如果是这样,您可以使其成为非静态的。否则,您需要以某种方式给它一个类实例......这需要查看更多代码
  • 那么您想要在哪个类的实例上调用该方法?不同的实例可能有不同的日志格式等。您需要您的OnChanged 处理程序是静态方法吗?
  • 为什么 OnChanged 是静态的?
  • 我建议尽可能避免静态。尝试使 Run 非静态。如果那不可能,创建一个类来封装功能的逻辑,并使用new FooClass()
  • 你为什么不让你的日志文件处理静态?

标签: c# methods static


【解决方案1】:

看来 OnChanged 应该是非静态的。通常只有特定的实例会调用 OnChanged。这是因为某事物发生变化的知识被封装在它自身的实例中。从您的 OnChanged 中删除静态,您就可以开始了。

或者如果你不能/不想让你的 OnChanged 非静态,你可以让你的 CreateLogFile 静态,我看不出有任何理由在你的方法之外删除你的变量:

    public static void CreateLogFile(string path, string msg)
    { 
        string sLogFormat;
        string sErrorTime;

        //sLogFormat used to create log files format :
        // dd/mm/yyyy hh:mm:ss AM/PM ==> Log Message
        sLogFormat = DateTime.Now.ToShortDateString().ToString() + " " + DateTime.Now.ToLongTimeString().ToString() + " ==> ";

        //this variable used to create log filename format "
        //for example filename : ErrorLogYYYYMMDD
        string sYear = DateTime.Now.Year.ToString();
        string sMonth = DateTime.Now.Month.ToString();
        string sDay = DateTime.Now.Day.ToString();
        sErrorTime = sYear + sMonth + sDay;

        StreamWriter sw = new StreamWriter(path + sErrorTime, true);
        sw.WriteLine(sLogFormat + msg);
        sw.Flush();
        sw.Close();

    }

【讨论】:

    【解决方案2】:

    你有两种方法:

    1- 如果您的 Logger 类是非静态的,请使用 YourLoggerClass log = new YourLoggerClass(); 创建一个新的 logger 对象。并做空隙

    2- 将您的 Logger 类设为静态,这样您就可以在任何地方轻松使用它:

    private static string sLogFormat;
    private static string sErrorTime;
    
    public static void CreateLogFile(string path, string msg)
    {
         ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-25
      • 2023-03-07
      • 2018-04-07
      • 2015-07-22
      • 2012-06-29
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多