2016-07-09 15 views
3

Also, ich habe diesen CodeWay Eigenschaft abhängig von anderer Eigenschaft zu setzen

 Process[] processesManager = Process.GetProcesses(); 
     List<ProcessInfo> temporaryProcessesList = new List<ProcessInfo>(); 
     for (int i = 0; i < processesManager.Length; ++i) 
     { 
      temporaryProcessesList.Add(new ProcessInfo(processesManager[i].ProcessName, processesManager[i].Id, TimeSpan.Zero, "Group")); 
     } 

     processesList = temporaryProcessesList.GroupBy(d => new {d.Name}).Select(d => d.First()).ToList(); 

Dieser Code für das Erhalten aktuelle Prozesse verwendet wird. Dann füge ich diese Prozeduren zu temporaryProcessesList hinzu. Und anstelle der einfachen Zeichenfolge "Group" möchte ich die Eigenschaft abhängig vom Namen des Prozesses festlegen. Wenn der Prozess beispielsweise den Namen ligaoflegends.exe hat, möchte ich die Gruppe auf "Games" setzen, wenn devenv.exe die Gruppe auf "Software development" setzen möchte.

Und meine Frage ist, wie man es am einfachsten/besten Weg macht? Ich habe über Dictionary mit String und Enum nachgedacht. Und vergleicht die mit String. Aber vielleicht gibt es einen besseren Weg.

ProcessInfo ist eine einfache Klasse mit 4 Eigenschaften und Konstruktor.

public class ProcessInfo 
{ 
    private string Name { get; set; } 
    private int Id { get; set; } 
    private TimeSpan Time { get; set; } 
    private string Group { get; set; } 

    public ProcessInfo(string name, int id, TimeSpan time, string group) 
    { 
     Name = name; 
     Id = id; 
     Time = time; 
     Group = group; 
    } 
} 

Antwort

1

Vielleicht ist das, was Sie suchen:

public class ProcessInfo 
{ 
    private string _name; 
    private string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      UpdateGroupName(); 
     } 
    } 
    private int Id { get; set; } 
    private TimeSpan Time { get; set; } 
    private string Group { get; set; } 

    private void UpdateGroupName() 
    { 
     Group = ProcessNames::GetGroupFromProcessName(Name); 
    } 

    public ProcessInfo(string name, int id, TimeSpan time) 
    { 
     Name = name; 
     Id = id; 
     Time = time; 
    } 
} 

internal static class ProcessNames 
{ 
    private static Dictionary<string, string> _names; 

    public static string GetGroupNameFromProcessName(string name) 
    { 
     // Make sure to add locking if there is a possibility of using 
     // this from multiple threads. 
     if(_names == null) 
     { 
      // Load dictionary from JSON file 
     } 

     // Return the value from the Dictionary here, if it exists. 
    } 
} 

Dieser Entwurf ist nicht perfekt, aber hoffentlich Sie Siehe die Idee. Sie könnten auch das Update des Namens Group in den Konstruktor verschieben, aber dann ändert sich der Name Group nicht, wenn Sie die Eigenschaft nach der Konstruktion festlegen.

Sie könnten auch die Schnittstelle mit INotifyPropertyChanged und/oder Abhängigkeitsinjektion reinigen. https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

+0

Es ist so viel mehr zu schreiben als mit Wörterbuch, da ich für jeden Prozess Fall schreiben müsste. Aber ja, das ist eine andere Lösung. – Porqqq

+0

Wahr, aber Sie könnten die 'UpdateGroupName'-Methode aktualisieren, um eine Liste von Prozessnamen und ihre entsprechenden Gruppennamen aus einer Textdatei, XML-Datei usw. zu lesen. Auf diese Weise könnten Sie die Gruppennamen ohne Neuaufbau aktualisieren. –

+0

Hmmmm .. Ich möchte es mit Wörterbuch tun. Ich meine, lesen Sie von JSON-Datei zu Wörterbuch, und ich denke, es wäre besser. Denkst du nicht? – Porqqq

3

Mit Wörterbuch ist der beste Weg, um dies zu erreichen:

var dictionary = new Dictionary<string, string>(); 
dictionary.Add("a.exe", "aGroup"); 
dictionary.Add("b.exe", "bGroup"); 

string val; 
if (dictionary.TryGetValue(processName, out val)) 
    processInfo.Group = val; 
else 
    processInfo.Group = "Undefined Group"; 
+0

Danke für die Antwort. Aber vielleicht würde jemand einen anderen Weg kennen. – Porqqq