2010-09-30 8 views
0

J'ai un certain nombre de clases différentes situées dans une bibliothèque de classes dans mon projet. J'utilise Quartz.NET (un système de planification) pour planifier et charger des travaux, et l'exécution réelle du travail est effectuée dans ces bibliothèques de classes. Je prévois d'avoir plusieurs types de types d'emplois, et chacun aura sa propre classe à exécuter dans la bibliothèque de classes.Méthodes dans les classes en C#

Un problème que j'ai, c'est que je ne peux pas imbriquer des méthodes dans ces classes. Par exemple, voici ma classe:

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

Si je tente de mettre une méthode dans la partie d'exécution de la classe, comme ...

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

Il attend la fin de la méthode d'exécution avant que mon GetFileList commence, et ne me laisse pas non plus accéder à la variable de contexte dont j'ai besoin.

J'espère que ce sens, merci encore - les gars règle

+0

où vous essayez de mettre la chaîne [] Fonction GetFileList – Thakur

Répondre

1

Vous semblez avoir mal compris comment fonctionne le code de classe?

GetFileList() n'exécute pas seulement parce que vous l'avez placé dans la classe après Execute() - vous devez appeler réellement, comme ceci:

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

ou ai-je mal compris tout à fait votre question?

1

Vous pouvez utiliser des expressions lambda:

public virtual void Execute(JobExecutionContext context) 
{ 

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

    string[] strings = getFileList(); 

} 
2

Non, vous ne pouvez pas les méthodes de nid. Voici quelques approches que vous pouvez utiliser à la place:

  • Vous pouvez créer des méthodes internes anonymous functions et les appeler d'une manière similaire à l'appel d'une méthode.
  • Vous pouvez promouvoir des variables locales dans une méthode pour les champs membres, puis vous pouvez y accéder à partir des deux méthodes.
+0

... ou vous pouvez simplement passer la variable de contexte dans un 'GetFileList' privé en tant que paramètre! – Timwi

1

Etes-vous en train d'essayer d'obtenir les résultats de la fonction GetFileList et de les utiliser dans Execute? Si oui, essayez ceci:

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

Execute est une méthode virtuelle, ne est pas un espace pour déclarer des méthodes supplémentaires,, ce ne est pas un espace de noms à l'intérieur que vous êtes censé placer toute logique pour le travail à déclarer nouvelles méthodes Si vous souhaitez utiliser la logique méthodique, déclarez-les simplement dans la définition de classe et appelez-les depuis la fonction d'exécution.

public virtual void Execute(JobExecutionContext context) 
{ 

    mymethod1(); 
    mymethod2(); 
} 

private void mymethod1() 
{} 

private void mymethod2() 
{} 
1

Il semble que vous souhaitez obtenir la liste des fichiers basé sur des informations de contexte - dans ce cas, il suffit d'ajouter un paramètre à la méthode GetFileList et passer de Execute:

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

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