设置 属性 的方法取决于其他 属性
Way to set property depending on other property
所以,我有这个代码
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();
此代码用于获取当前进程。然后我将这些过程添加到 temporaryProcessesList
。而不是简单的字符串 "Group" 我想根据进程名称设置 属性 。例如,如果进程名称为 leagueoflegends.exe,那么我想将组设置为 "Games",如果它的名称为 devenv.exe,我想将组设置为 "Software development"。
我的问题是,如何以 simplest/best 的方式进行?我正在考虑将 Dictionary 与字符串和枚举一起使用。并将 ProcessName
与字符串进行比较。但也许有更好的方法。
ProcessInfo
很简单 class,有 4 个属性和构造函数。
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;
}
}
使用字典是实现此目的的最佳方式:
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";
也许这就是您要找的:
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.
}
}
这个设计并不完美,但希望你能看到这个想法。您也可以将 Group
名称的更新移动到构造函数,但是如果您在构造后设置 属性,它不会更改 Group
名称。
此外,您可以使用 INotifyPropertyChanged
and/or 依赖注入来清理界面。 https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx
所以,我有这个代码
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();
此代码用于获取当前进程。然后我将这些过程添加到 temporaryProcessesList
。而不是简单的字符串 "Group" 我想根据进程名称设置 属性 。例如,如果进程名称为 leagueoflegends.exe,那么我想将组设置为 "Games",如果它的名称为 devenv.exe,我想将组设置为 "Software development"。
我的问题是,如何以 simplest/best 的方式进行?我正在考虑将 Dictionary 与字符串和枚举一起使用。并将 ProcessName
与字符串进行比较。但也许有更好的方法。
ProcessInfo
很简单 class,有 4 个属性和构造函数。
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;
}
}
使用字典是实现此目的的最佳方式:
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";
也许这就是您要找的:
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.
}
}
这个设计并不完美,但希望你能看到这个想法。您也可以将 Group
名称的更新移动到构造函数,但是如果您在构造后设置 属性,它不会更改 Group
名称。
此外,您可以使用 INotifyPropertyChanged
and/or 依赖注入来清理界面。 https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx