C# 类和对象 : Object contains a single vaue

标签 c# class object

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

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

这是我的代码。

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; }
}

此代码返回 http://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;
}

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

关于C# 类和对象 : Object contains a single vaue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415573/

相关文章:

C# string.replace 去除非法字符

java - 一次编辑所有二维数组对象?

c++ - 类内类问题

java - 对象无法访问定义为公共(public)的方法

delphi - delphi 可以动态加载类吗

java - Java 中的吃 bean 碰撞

javascript - 循环遍历对象并设置为第二个对象javascript中的值

c# - 双工 channel 故障事件不会在第二次连接尝试时出现

c# - SQL 服务器 : is there any performance penalty for wrapping a SELECT query in a transaction?

c# - 如果从 C# 中的 try 或 catch block 返回,finally block 是否会被执行?如果是这样,是在返回之前还是之后?