如何在另一个对象中存储对象属性的引用?

时间:2010-08-17 20:29:06

标签: c# winforms object properties

这是一个C#winforms app。

前言

我正在创建一个表单,允许用户将现有MySql或SQL Server数据库中的数据导入到我的SQL Server数据库中。这允许用户快速导入IP地址和其他数据,而无需通过控件重新输入。

示例:

简化,我有两个对象,FieldObjectSensorObject。存在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时,我可以有效地消除switch语句。

类似的东西:

foreach(FieldObject f in myFieldList)
{
    mySensor(f.mySensorField) = Convert.ToString(Reader[f.DestinationField]);
}

我不确定C#中的哪种技术适合这种应用。我研究过参考值和反射,看起来都不合适。

我感谢任何见解和建议,甚至重新思考这种方法。

3 个答案:

答案 0 :(得分:2)

你必须使用反射来做到这一点。 最终应该像:

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]);
}

GetProperties获取每个属性的属性信息,可用于设置值。

当然可以缓存属性信息。只需编写一次并在运行后立即重构。不要过度复杂化这称为过早优化并直接导致地狱;)

答案 1 :(得分:1)

实际上,反射并不是一个坏主意,特别是如果为每个属性名称填充PropertyInfo个实例的字典。

答案 2 :(得分:1)

你可以用反射来做。您使用相关名称获取属性的PropertyInfo,获取setter的MethodInfo,然后调用它。

但是,可以存储按名称存储的值的关联数组(Dictionary或HastTable等),如果合适,这将更容易处理。