C# class 和 object : Object 包含单个值

C# class and object : Object contains a single vaue

如果我的问题标题不恰当,我很抱歉。

我是编程方面的新手,正在尝试编写一个控制台应用程序以从注册表中获取计算机上所有已安装的应用程序。

这是我的代码。

class Program
{
    static void Main(string[] args)
    {
        Console.Title = "Windows App Finder - Finds all the installed apps on the station";

        List<AppDetails> apps = new List<AppDetails>();
        apps = GetInstalledApps();
        ListAllApps(apps);
        Console.WriteLine("\nPress any key to exit.");
        Console.ReadLine();
    }

    private static List<AppDetails> GetInstalledApps()
    {
        string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
        AppDetails appInfo = new AppDetails();
        List<AppDetails> apps = new List<AppDetails>();
        using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
        {
            foreach (string subkey_name in key.GetSubKeyNames())
            {
                using (RegistryKey subkey = key.OpenSubKey(subkey_name))
                {

                    appInfo.appName = (string)subkey.GetValue("DisplayName");
                    appInfo.publisher = (string)subkey.GetValue("Publisher");
                    appInfo.appVersion = (string)subkey.GetValue("DisplayVersion");
                    if (appInfo.appName != null )
                    {
                        apps.Add(appInfo);
                    }
                }
            }
        }
            return apps;
    }
    private static void ListAllApps(List<AppDetails> appDetails)
    {
        int i = 0;
        foreach (AppDetails appDetail in appDetails)
        {
            Console.WriteLine(i.ToString() + ". Name: " + appDetail.appName + " Version: " + appDetail.appVersion + " Publisher: " + appDetail.publisher);
            i++;
        }
    }
}

public class AppDetails
{
    public string appName { get; set; }
    public string appVersion {get; set;}
    public string publisher {get;set;}
    public DateTime installDate { get; set; }
}

}

此代码returnshttp://i.stack.imgur.com/tKtNr.png 单个应用程序名称重复多次。这段代码有什么问题。

提前致谢

您必须在您的 foreach 循环中实例化 AppDetails appInfo = new AppDetails();,否则您将以相同的对象一次又一次地被修改并添加到列表中而告终。

只需将实例化移动到循环内部即可。

private static List<AppDetails> GetInstalledApps()
{
    string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    List<AppDetails> apps = new List<AppDetails>();
    using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
    {
        foreach (string subkey_name in key.GetSubKeyNames())
        {
            using (RegistryKey subkey = key.OpenSubKey(subkey_name))
            {
                AppDetails appInfo = new AppDetails(); //HERE
                appInfo.appName = (string)subkey.GetValue("DisplayName");
                appInfo.publisher = (string)subkey.GetValue("Publisher");
                appInfo.appVersion = (string)subkey.GetValue("DisplayVersion");
                if (appInfo.appName != null)
                {
                    apps.Add(appInfo);
                }
            }
        }
    }
    return apps;
}

由于您没有在循环内实例化对象,它被多次添加到列表中,并且列表中的所有实例都指向同一个引用。因此,您会看到多次返回相同的值。这将是您迭代中的最后一个值。