Методы в классах в C # - PullRequest
       24

Методы в классах в C #

0 голосов
/ 30 сентября 2010

У меня в проекте есть несколько разных предложений, которые находятся в библиотеке классов. Я использую 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 ]

2 голосов
/ 30 сентября 2010

Нет, вы не можете вкладывать методы. Вот несколько подходов, которые вы можете использовать вместо:

  • Вы можете создавать анонимные функции внутри методов и вызывать их аналогично вызову метода.
  • Вы можете преобразовать локальные переменные одним методом в поля-члены, а затем получить к ним доступ из обоих методов.
1 голос
/ 30 сентября 2010

Кажется, вы хотите получить список файлов на основе некоторой контекстной информации - в этом случае просто добавьте параметр в метод GetFileList и передайте его из Execute:

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

private string[] GetFileList(JobExecutionContext) { ... }
1 голос
/ 30 сентября 2010

Execute - это виртуальный метод, он не является пространством для объявления дополнительных методов, внутри вы должны разместить любую логику для задания, а не пространство имен для объявления новых методов.Если вы хотите использовать методизированную логику, просто объявите их в определении класса и вызовите их из функции execute.

public virtual void Execute(JobExecutionContext context)
{

    mymethod1();
    mymethod2();
}

private void mymethod1()
{}

private void mymethod2()
{}
1 голос
/ 30 сентября 2010

Вы пытаетесь получить результаты от функции 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;
    }
}
1 голос
/ 30 сентября 2010

Вы можете использовать лямбда-выражения:

public virtual void Execute(JobExecutionContext context) 
{ 

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

    string[] strings = getFileList();

} 
1 голос
/ 30 сентября 2010

Вы, похоже, неправильно поняли, как работает код класса?

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
    }
}

или я совершенно не понял ваш вопрос?

...