Вызов статического словаря System.TypeInitializationException

У меня есть статический класс для хранения словаря и 2 метода получения доступа к нему.

Вот мой класс:


public static class ConfiguraCuadros
    {    
    public static Dictionary<string,Dictionary<string,Dictionary<string,Dictionary<string,string>>>> GetDictionary()
       {
           // Try to get the result in the static Dictionary
           return _configcuadros;
       }

       public static Dictionary<string, Dictionary<string, Dictionary<string, string>>> GetHoja(string key)
       {
           // Try to get the result in the static Dictionary
           Dictionary<string, Dictionary<string, Dictionary<string, string>>> result = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();
           if (_configcuadros.TryGetValue(key, out result))
           {
               return result;
           }
           else
           {
               return null;
           }
       }

    public static readonly Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> _configcuadros = new Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> 
    {

     {   "Formato01",   //this is just a hint, the dictionary is much more extensive
                new Dictionary<string, Dictionary<string, Dictionary<string, string>>> 
                {
                    {
                        "F01C01A",      
                        new Dictionary<string, Dictionary<string, string>> 
                        {
                            {
                                "X",
                                new Dictionary<string, string>
                                {
                                    { "key1" , "value1" },
                                    { "key2" , "value2" },
                                    { "key3" , "value3" },
                                }
                            },
                        }
                    },

                }

            },
        }
    }`

Когда я использую метод получения,

ConfiguraCuadros.GetDictionary();

Выдает исключение:

A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
'ConfiguraCuadros.GetDictionary()' threw an exception of type 'System.TypeInitializationException'
    base: {"The type initializer for 'beDGRAIC.ConfiguraCuadros' threw an exception."}
    TypeName: "beDGRAIC.ConfiguraCuadros"

or

'ConfiguraCuadros.GetHoja("Formato01")' threw an exception of type 'System.TypeInitializationException'
    base: {"The type initializer for 'beDGRAIC.ConfiguraCuadros' threw an exception."}
    TypeName: "beDGRAIC.ConfiguraCuadros"

Как видите, я намерен создать статический словарь. Я думаю, что проблема в объявлении словаря... но я не вижу, где...

На всякий случай, "beDGRAIC" - это мое пространство имен.

Спасибо за вашу помощь!


person culebrin    schedule 29.10.2014    source источник
comment
Прочитайте внутреннее исключение.   -  person SLaks    schedule 29.10.2014
comment
Не могли бы вы использовать Tuple вместо многоуровневого вложенного Dictionary   -  person Shiva    schedule 29.10.2014
comment
Вы серьезно Dictionary<string,Dictionary<string,Dictionary<string,Dictionary<string,string>>>> ? Прежде чем исправлять TypeInitializationException, подумайте о хорошей структуре данных.   -  person Sriram Sakthivel    schedule 29.10.2014


Ответы (1)


Ваш код работает (почти) как у меня.

Я просто добавил отсутствующую точку с запятой, чтобы заставить ее скомпилироваться, но затем могу вызывать ConfiguraCuadros.GetDictionary(); без каких-либо исключений.

Вот код с отсутствующей точкой с запятой:

public static class ConfiguraCuadros
{
    public static Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> GetDictionary()
    {
        // Try to get the result in the static Dictionary
        return _configcuadros;
    }

    public static Dictionary<string, Dictionary<string, Dictionary<string, string>>> GetHoja(string key)
    {
        // Try to get the result in the static Dictionary
        Dictionary<string, Dictionary<string, Dictionary<string, string>>> result = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();
        if (_configcuadros.TryGetValue(key, out result))
        {
            return result;
        }
        else
        {
            return null;
        }
    }

    public static readonly Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> _configcuadros = new Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>> 
        {
            {   "Formato01",   //this is just a hint, the dictionary is much more extensive
                new Dictionary<string, Dictionary<string, Dictionary<string, string>>> 
                    {
                        {
                            "F01C01A",      
                            new Dictionary<string, Dictionary<string, string>> 
                            {
                                {
                                    "X",
                                    new Dictionary<string, string>
                                    {
                                        { "key1" , "value1" },
                                        { "key2" , "value2" },
                                        { "key3" , "value3" },
                                    }
                                },
                            }
                        }
                     }
              }
        };
}

[ОБНОВИТЬ]

Я согласен с комментариями выше о проверке InnerException как общем правиле для исключения инициализации типа и, в частности, о недружественном характере типа данных!

person Stewart_R    schedule 29.10.2014
comment
У меня были проблемы с чтением точного внутреннего исключения, потому что этот вызов находится в методе, и только этот вызванный метод был в скобке попытки-поймать, и да, ответ был во внутреннем исключении. - person culebrin; 30.10.2014
comment
Теперь у меня странная проблема со строкой в ​​двойных кавычках в одном словаре { "TXT", "(3/) ""A""." },, компилятор подчеркивает "A"".", и я не знаю почему... (там написано "} ожидаемо") - person culebrin; 30.10.2014
comment
Компилятору (или мне!) непонятно, что такое ваша строка. Вам нужно экранировать символы, если вы включаете их в строковый литерал. - person Stewart_R; 30.10.2014
comment
Я пытаюсь избежать их, исходная строка: (3/) "A"., но, похоже, в моем подходе есть ошибка, которую я не вижу. - person culebrin; 30.10.2014