C # реализует класс, чтобы просто держать переменные - PullRequest
1 голос
/ 14 июля 2011

У меня есть класс:

class GetColumnsNames
    {

        public static int Occurrence_Date = Convert.ToInt16(ConfigurationSettings.AppSettings["Occurrence_Date"].ToString());
        public static int Preanalytical_Before_Testing = Convert.ToInt16(ConfigurationSettings.AppSettings["1_0_Preanalytical_Before_Testing"].ToString());
        public static int Cup_Type = Convert.ToInt16(ConfigurationSettings.AppSettings["Cup_Type"].ToString());
        public static int Analytical_Testing_Phase = Convert.ToInt16(ConfigurationSettings.AppSettings["Analytical_Testing_Phase"].ToString());
        public static int Area = Convert.ToInt16(ConfigurationSettings.AppSettings["Area"].ToString());
        public static int Postanalytical_After_Testing = Convert.ToInt16(ConfigurationSettings.AppSettings["Postanalytical_After_Testing"].ToString());
        public static int Other = Convert.ToInt16(ConfigurationSettings.AppSettings["Other"].ToString());
        public static int Practice_Code = Convert.ToInt16(ConfigurationSettings.AppSettings["Practice_Code"].ToString());
        public static int Comments = Convert.ToInt16(ConfigurationSettings.AppSettings["Comments"].ToString());
    }

Мне нужно иметь возможность ссылаться на значения в этом классе, как это без инициализации класса:

int var1 = GetColumnsNames.Area + 1

Я получаю сообщение об ошибке, подобное этому: The type initializer for 'BulkUploadToLOMDatabase.GetColumnsNames' threw an exception.

что я делаю не так>?

Ответы [ 7 ]

4 голосов
/ 14 июля 2011

Ваш класс имеет статические свойства, которые должны инициализироваться при полной загрузке типа.

Одно из ваших статических свойств вызывает исключение.Поскольку вы ничего не проверяете, например, если один из AppSettings не существует, он выдаст исключение и тип не будет инициализирован.

Запустите программу в отладчике и установите для нее значениесломайте любое управляемое исключение и посмотрите, в чем проблема на самом деле.Или переписать свой код, чтобы сделать его более безопасным.

4 голосов
/ 14 июля 2011

Если вы обращаетесь к классу таким образом каждый раз, я бы сделал его статическим:

public static class GetColumnsNames

И предоставил бы ваши параметры получения свойств:

public static int Occurrence_Date 
{
    get
    {
        return Convert.ToInt16(ConfigurationSettings.AppSettings["Occurrence_Date"].ToString());
    }
}
2 голосов
/ 14 июля 2011

Одна из ваших инициализаций полей выдает ошибку, возможно, опечатку в одном из имен параметров конфигурации (в этом случае вы вызываете ToString() для экземпляра неинициализированного объекта), или недопустимое преобразование int и т. Д. Запуск в режим отладки для отслеживания ошибки.

Один из более понятных вариантов - использование управления пользовательской конфигурацией

1 голос
/ 14 июля 2011

Скорее всего, один из наших AppSettings отсутствует. Таким образом, выполнение AppSetting ["setting"] возвращает ноль. Затем вызов ToString для нулевых значений вызывает проблемы инициализации. Убедитесь, что все наши AppSettings действительно существуют в проекте.

1 голос
/ 14 июля 2011

Как и было сказано, во время статической инициализации для класса было сгенерировано исключение.

Я предполагаю, что одно из значений AppSettings пустое или не целочисленное, а Convert.ToInt16 бросилисключение

1 голос
/ 14 июля 2011

Скорее всего, один из ваших параметров конфигурации не существует или не относится к нужному типу, поэтому возникает исключение - любое необработанное исключение приведет к сбою инициализации типа, поэтому вы видите эту ошибку.

1 голос
/ 14 июля 2011

Инициализатор для одного (или нескольких) ваших членов выдает исключение.

Возможно, это потому, что один из них не может быть проанализирован как Int16.Либо потому, что в AppSettings нет значения, либо потому, что он не в правильном формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...