2016-04-18 1 views
0

Je ne sais déjà que vous ne pouvez pas normalement cela, mais voici ma situation:Comment puis-je accéder à un membre non statique dans un gestionnaire d'événements statique?

J'ai un List<T> non-statique qui est ajouté à la normale pendant l'utilisation, puis jeté dans une base de données à un intervalle. Je veux être en mesure d'utiliser AppDomain.CurrentDomain.ProcessExit afin de vider toutes les valeurs dans mon List<T> qui n'ont pas encore été sauvegardées. Le List est effacé chaque fois qu'il est vidé.

Y at-il un moyen d'accéder à ce List sans le contexte donné même s'il est statique -> non-statique?

+0

[Non] (http://programmers.stackexchange.com/questions/211137/why-can-static-methods-only-use-static-data). Mais si vous pouvez accéder aux variables d'instance, vous pouvez accéder aux données. En fin de compte tout est dans un contexte et avec les bons designs, méthodes et API, vous pouvez faire ce que vous essayez. – TheNorthWes

+0

Rendre le gestionnaire non statique. – SLaks

+0

@ SLaks ou rendre la liste statique. – RoadieRich

Répondre

1

Ajoutez simplement votre gestionnaire en tant que lambda, dans un périmètre où il a accès à votre liste.

var list = new List<string>() 
{ 
    "Item 1", 
    "Item 2" 
}; 

AppDomain.CurrentDomain.ProcessExit += (sender, theArgs) => 
{ 
    File.WriteAllLines(@"C:\temp\mylist.txt", list); 
}; 

Une belle façon serait de résumer ce comportement dans une sous-classe de List<T>.

public class MyReallyPersistentList<T> : List<T> 
{ 
    public MyReallyPersistentList() 
    { 
     AppDomain.CurrentDomain.ProcessExit += (sender, args) => 
     { 
      var items = this.Select(i => i?.ToString()); 
      File.AppendAllLines(@"C:\temp\mylist.txt", items); 
     }; 
    } 
} 
+0

donc je peux définir le gestionnaire pour ProcessExit même si Application.Run() a déjà été exécuté? – 5SK5

+0

Vous n'avez jamais mentionné Application.Run auparavant. Est-ce une application WinForms? Je ne vois pas pourquoi cela serait important - vous pouvez ajouter un gestionnaire ProcessExit à tout moment avant que votre processus ne se termine (évidemment pas après !!) –

+0

Oui, c'est winforms – 5SK5