Не удается записать строку из таблицы в строковый атрибут в C#

#c# #types

#c# #типы

Вопрос:

Я считываю значения из mdb-файла локального доступа. Одно значение хранится в виде строки в базе данных, и у меня оно есть в таблице. При использовании GetType() метода он возвращает «System.Строка » и я могу распечатать ее на консоли без проблем, но когда я хочу использовать ее в качестве атрибута для другого метода (требуется строка) Я получаю сообщение об ошибке («Не удается преобразовать из ‘object’ в ‘string'» и то же самое для ‘int’). Те же проблемы возникают с некоторыми значениями int.

Я делаю что-то неправильно или в чем проблема в таком случае?

 Console.WriteLine(dt.Rows[0][ProjName]); //prints project_name
Console.WriteLine(dt.Rows[0][ProjName].GetType()); //print "System.String"

Project = new Project(dt.Rows[0][ProjName], dt.Rows[0][MinDay], dt.Rows[0][MinWeek], dt.Rows[0][DayWeek]); //Error
Project = new Project(Convert.ToString(dt.Rows[0][ProjName]), Convert.ToInt32(dt.Rows[0][MinDay]), Convert.ToInt32(dt.Rows[0][MinWeek]), Convert.ToInt32(dt.Rows[0][DayWeek])); //Works Fine
  

Конструктор для класса Project:

 public Project(string projectName, int hoursPerDay, int hoursPerWeek, int daysPerWeek)
  

Комментарии:

1. Ваше использование Console.WriteLine() вызывает перегрузку, принимающую параметр типа Object . Эта функция overlaod внутренне вызывает ToString() заданное значение объекта, демонстрируя то, что вы видите.

Ответ №1:

Вы указали в своем ответе, что это работает при преобразовании, и это необходимо, поскольку они не являются строками и целыми числами. Они являются объектами. Вы можете создать methid для обработки этого, если хотите.

 public Project CreateProject(object projectName, object hoursPerDay, object hoursPerWeek, object daysPerWeek)
{
    return new Project(projectName.ToString(), Convert.ToInt32(hoursPerDay), Convert.ToInt32(hoursPerWeek), Convert.ToInt32(daysPerWeek);
}
  

Комментарии:

1. projectName.ToString() (в скобках) — или OP получит другую странную ошибку 🙂

Ответ №2:

Вы должны явно приводить объекты:

Для приведения к строке используйте:

 Object.ToString();
  

Для преобразования в целые числа используйте:

 Int32.TryParse(String, out int);
  

Ваш конструктор становится

 Project = new Project(dt.Rows[0][ProjName].ToString(), Int32.Parse(dt.Rows[0][MinDay]), Int32.Parse(dt.Rows[0][MinWeek]), Int32.Parse(dt.Rows[0][DayWeek]));
  

Примечание: Использование Int32.Parse вместо Int32.TryParse предполагает, что предоставленный аргумент всегда является допустимым значением int, и не дает вам возможности проверить, было ли приведение успешным.

Ответ №3:

dt.Rows[0][ProjName] возвращает тип object , и ваш метод ожидает string . Даже если вы знаете, что это строка, это не очевидно для компилятора и должно быть указано явно с использованием приведения, как вы показываете в своем последнем примере, хотя простое приведение должно быть более эффективным, чем ненужное преобразование:

 Project = new Project((string)dt.Rows[0][ProjName], ...