C#中的类方法

时间:2010-09-30 11:20:01

标签: c# class methods quartz.net

我的项目中的类库中有许多不同的clases。我使用Quartz.NET(一个调度系统)来安排和加载作业,实际的作业执行是在这些类库中完成的。我打算有很多类型的工作类型,每个工作类型都有自己的类在类库中执行。

我遇到的一个问题是我无法在这些类中嵌套方法。例如,这是我的班级:

public class FTPtoFTP : IJob
{
    private static ILog _log = LogManager.GetLogger(typeof(HTTPtoFTP));

    public FTPtoFTP()
    {

    }

    public virtual void Execute(JobExecutionContext context)
    {          
        //Code that executes, the variable context allows me to access the job information
    }
}

如果我尝试将一个方法放在类的执行部分,例如......

 string[] GetFileList()
 { 
    //Code for getting file list
 }

它期望在我的GetFileList开始之前执行方法的结束,并且也不允许我访问我需要的上下文变量。

我希望这是有道理的,再次感谢 - 你们统治

6 个答案:

答案 0 :(得分:2)

不,你不能嵌套方法。您可以使用以下几种方法:

  • 您可以在方法内部创建anonymous functions,并以与调用方法类似的方式调用它们。
  • 您可以将一个方法中的局部变量提升为成员字段,然后您可以从这两种方法中访问它们。

答案 1 :(得分:1)

您似乎误解了类代码的工作原理?

GetFileList()不会因为你在Execute()之后将它放在课堂中而执行 - 你必须实际调用它,如下所示:

public class FTPtoFTP : IJob
{
    private static ILog _log = LogManager.GetLogger(typeof(HTTPtoFTP));

    public FTPtoFTP()
    {

    }

    public virtual void Execute(JobExecutionContext context)
    {
        string[] files = GetFileList();

        //Code that executes, the variable context allows me to access the job information
    }

    string[] GetFileList()
    { 
        //Code for getting file list
    }
}

还是我完全误解了你的问题?

答案 2 :(得分:1)

您可以使用lambda表达式:

public virtual void Execute(JobExecutionContext context) 
{ 

    Func<string[]> getFileList = () => { /*access context and return an array */};

    string[] strings = getFileList();

} 

答案 3 :(得分:1)

您是否尝试从GetFileList函数获取结果并在Execute中使用它们? 如果是这样,那么试试这个:

public class FTPtoFTP : IJob
{
    private static ILog _log = LogManager.GetLogger(typeof(HTTPtoFTP));

    public FTPtoFTP()
    {

    }

    public virtual void Execute(JobExecutionContext context)
    {
        //Code that executes, the variable context allows me to access the job information
        string[] file_list = GetFileList();
        // use file_list
    }

    private string[] GetFileList()
    { 
       //Code for getting file list
       return list_of_strings;
    }
}

答案 4 :(得分:1)

Execute是一个虚方法,它不是一个声明其他方法的空间,在你内部意味着为工作放置任何逻辑,它不是声明新方法的命名空间。如果要使用方法化逻辑,只需在类定义中声明它们并从execute函数中调用它们。

public virtual void Execute(JobExecutionContext context)
{

    mymethod1();
    mymethod2();
}

private void mymethod1()
{}

private void mymethod2()
{}

答案 5 :(得分:1)

似乎你想根据一些上下文信息获取文件列表 - 在这种情况下,只需在GetFileList方法中添加一个参数并从Execute传递它:

public virtual void Execute(JobExecutionContext context)
{
    string[] fileList = this.GetFileList(context);
    ...
}

private string[] GetFileList(JobExecutionContext) { ... }