Почему установка статического объекта приводит к прерыванию вызовов моего метода? - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть приложение 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).

Я не получаю никаких ошибок. Другие точки отладки не обнаружены, и я могу без проблем перемещаться по графическому интерфейсу приложения (и без данных).

Есть идеи, в чем проблема?

Спасибо

Jason

1 Ответ

1 голос
/ 20 сентября 2011

Вы нажимаете 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; } }
}
...