JYe*_*ton 6 c# properties object winforms
这是一个C#winforms应用程序.
前言:
我正在创建一个表单,允许用户将现有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;}
}
Run Code Online (Sandbox Code Playgroud)
问题:
当用户填充各个字段时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;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它需要更多冗余代码来处理对象的更多属性.
题:
我想要一些存储SensorObject数据所属属性的方法,这样当FieldObjects在列表中迭代时,我可以有效地消除switch语句.
就像是:
foreach(FieldObject f in myFieldList)
{
mySensor(f.mySensorField) = Convert.ToString(Reader[f.DestinationField]);
}
Run Code Online (Sandbox Code Playgroud)
我不确定C#中的哪种技术适合这种应用.我研究了参考值和反射,似乎都不合适.
我感谢任何见解和建议,甚至重新思考这种方法.
你必须使用反射来做到这一点。最终应该是这样的:
var sensorFields = typeof(SensorObject).GetProperties()
foreach(var field in fields)
{
var info = sensorFields.First(sensorField => sensorField.Name == field.Name);
var value = Convert.ToString(Reader[field.Destination]);
info.SetValue(sensorObj, value, new object[0]);
}
Run Code Online (Sandbox Code Playgroud)
GetProperties 获取每个属性的属性信息,可用于设置值。
当然,属性信息可以被缓存。只需编写一次并在运行后立即重构。不要过于复杂化,这被称为过早优化,会直接导致地狱;)
| 归档时间: |
|
| 查看次数: |
3426 次 |
| 最近记录: |