Это приложение winforms C#.Как сохранить ссылку на свойство объекта в другом объекте?
Предисловие:
Я создаю форму, которая позволит пользователям импортировать данные из существующей базы данных MySql или SQL Server в моей базе данных SQL Server. Это позволяет пользователям быстро импортировать IP-адреса и другие данные без повторного ввода его через элемент управления.
Пример:
упрощенный, у меня есть два объекта, FieldObject
и SensorObject
. FieldObject
существует для хранения имен и типов полей исходной и целевой базы данных. SensorObject
- это объект, который я позже заполняю из записей в базе данных. Для простоты я опускаю обработку типов и другие функции, которые не имеют отношения к вопросу. (Данные для DestinationField
ограничивается список, который я предоставить пользователю, и приходит из массива или списка в программе.) Вот пример как:
public class FieldObject
{
public string DestinationField {get; set;}
public string SourceField {get; set;}
}
public class SensorObject
{
public string Name {get; set;}
public string IPAddress {get; set;}
}
Проблема:
Когда пользователь заполняет различные поля FieldObject
, я использую эту информацию для заполнения базы данных назначения, хотя у меня есть большой оператор switch, который проверяет имя поля назначения, чтобы узнать, какое свойство принадлежит SensorObject
.
Например:
// Reader is a SqlDataReader with the prerequisite database connection
FieldObject myField = new FieldObject
{
DestinationField = "name",
SourceField = "proprietary"
};
SensorObject mySensor = new SensorObject();
switch (myField.DestinationField)
{
case "name":
mySensor.Name = Convert.ToString(Reader[myField.DestinationField]);
break;
case "ip_address":
mySensor.IPAddress = Convert.ToString(Reader[myField.DestinationField]);
break;
}
Как вы можете видеть, это потребует более избыточного кода для обработки дополнительных свойств для объекта.
Вопрос:
Я хотел бы каким-то образом сохраняя свойство SensorObject
, что данные принадлежит, так что при переборе FieldObjects
в списке, я могу эффективно устранить оператор коммутатора.
Что-то вроде:
foreach(FieldObject f in myFieldList)
{
mySensor(f.mySensorField) = Convert.ToString(Reader[f.DestinationField]);
}
Я не уверен, что метод в C# одалживает к такого рода приложения. Я изучил ссылочные ценности и размышления, и они не кажутся подходящими.
Я ценю любые идеи и советы или даже способы переосмыслить этот подход.
Можете ли вы использовать ORM для решения этой проблемы, поэтому вам не нужно писать этот избыточный код? –
Реляционное сопоставление объектов? Я подозреваю, что мне не пришлось искать, что такое «ОРМ», я мог бы использовать его. :) Извините, все-таки новичок в большинстве случаев! – JYelton
Посмотрите на NHibernate: http://nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx в долгосрочной перспективе ORM убирают большую часть боли при работе с реляционными базами данных, однако они требуют некоторой работы для начала. – Zebi