根据其他属性设置属性的方法
Posted
技术标签:
【中文标题】根据其他属性设置属性的方法【英文标题】:Way to set property depending on other property 【发布时间】:2016-07-09 17:14:36 【问题描述】:所以,我有这个代码
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
。而不是简单的字符串“组”,我想根据进程的名称设置属性。例如,如果进程名称为 Leagueoflegends.exe,那么我想将组设置为“游戏”,如果它的 devenv.exe 我想将组设置为“软件开发”。
我的问题是,如何以最简单/最好的方式做到这一点?我正在考虑将 Dictionary 与字符串和枚举一起使用。并将ProcessName
与字符串进行比较。但也许有更好的方法来做到这一点。
ProcessInfo
是具有 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;
【问题讨论】:
【参考方案1】:使用字典是最好的方法:
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";
【讨论】:
感谢您的回答。但也许有人会知道其他方法。【参考方案2】:也许这就是你要找的东西:
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
和/或依赖注入来清理接口。 https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx
【讨论】:
它的写作方式比使用字典要多,因为我需要为每个进程编写案例。但是,是的,那是另一种解决方案。 是的,但您可以更新UpdateGroupName
方法以从文本文件、XML 文件等中读取进程名称及其对应组名的列表。这样,您可以更新组名无需重建。
Hymm.. 我想用字典来做。我的意思是从 json 文件读取到字典,我认为这会是更好的方法。你不觉得吗?
这就是我会做的。创建一个加载和缓存 JSON 文件的类,然后使用该类根据进程名称设置组名称。我会更新答案中的代码给你一个想法。以上是关于根据其他属性设置属性的方法的主要内容,如果未能解决你的问题,请参考以下文章
关于Jquery获取和设置属性的两个方法prop()/attr()的区别。
在默认情况下可枚举设置为 false 的 JS 中创建对象属性的其他方法是啥?