为什么设置静态对象导致我的方法调用中止?

时间:2011-09-19 21:41:22

标签: c# wpf static abort

我有一个WPF应用程序,其中包含4个选项卡。 Tab1是第一个加载了应用程序的选项卡。我有一个Tab1Load方法(选项卡的名称),它看起来像:

private void Tab1Load(object sender, RoutedEventArgs e)
    {
        myConfig.LoadConfigurationData();
        XiphosDB.DataContext = Xiphos.XiphosDbNames;
    }

myConfig被声明在Window1.xaml.cs文件的顶部

LoadConfigData myConfig = new LoadConfigData();

LoadConfigData如下所示:

public void LoadConfigurationData()
    {
        LoadGen2Data();
        LoadXiphosData();
        LoadTestConsumerData();
    }

第一个方法调用LoadGen2Data一直运行到结尾,此时它为静态对象设置了一个值。电话是:

var count = 0;
        foreach (var name in Gen2.allFiNames)
        {
            Gen2.ApiKeys.Add(name, APIKeys[count]);
            Gen2.ConnectStrings.Add(name, connectStrings[count]);
            Gen2.LongNames.Add(name, LongNames[count]);
            count++;
        }

Gen2声明是:

 public class Gen2
{
    public static List<string> allFiNames { get; set; }

    public static Dictionary<string, string> LongNames { get; set; }
    public static Dictionary<string, string> ApiKeys { get; set; }
    public static Dictionary<string, string> ConnectStrings { get; set; }
}

在调用Gen2.ApiKeys.Add之后,应用程序跳过其所在的方法(LoadGen2Data)而不调用其余的Add语句,然后退出LoadConfigurationData方法而不调用其余两个方法(LoadXiphosData)和LoadTestConsumerData)。

单步进入foreach循环的顶部我已经验证了“name”值已填充且APIKeys [count]提供了合法值(GUID)。

我没有收到任何错误。没有捕获其他调试点,我可以在应用程序GUI中移动而没有任何问题(并且没有数据)。

知道问题是什么吗?

谢谢,

杰森

1 个答案:

答案 0 :(得分:1)

您正在点击NullReferenceException

public static Dictionary<string, string> LongNames { get; set; }

因为自动生成的支持属性为null。对于其他Dictionary变量和List变量,也会发生这种情况。

你可以这样解决:

private static Dictionary<string, string> longNames = new Dictionary<string, string>();

public static Dictionary<string, string> LongNames { get { return longNames; } set { longNames = value; } }

在这种情况下,你甚至可以跳过设定者。

public class Gen2
{
    private static List<string> allFiNames = new List<string> allFiNames();
    public static List<string> AllFiNames { get { return allFiNames; } }

    private static Dictionary<string, string> longNames = new Dictionary<string, string>();
    public static Dictionary<string, string> LongNames { get { return longNames; } }

    private static Dictionary<string, string> apiKeys = new Dictionary<string, string>();
    public static Dictionary<string, string> ApiKeys { get { return apiKeys; } }

    private static Dictionary<string, string> connectStrings = Dictionary<string, string>();
    public static Dictionary<string, string> ConnectStrings { get { return connectStrings; } }
}