根据其他属性设置属性的方法

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 中创建对象属性的其他方法是啥?

jquery怎么给元素设置属性

elasticsearch之mappings的其他设置:indexcopy_to对象属性settings

推送新 VC 时设置 UI 属性的公认方法是啥?