【发布时间】:2013-11-19 22:40:38
【问题描述】:
我有一些代码用于将数据行复制到您提供的对象中。数据行是弱类型的。现在,我可以使用反射将数据行中的所有数据分配给对象以获取属性,迭代这些属性并使用数据行设置它们的值。虽然这有效,但它仅在底层数据类型相同(没什么大不了)时才有效,更重要的是,只要属性和字段的顺序相同。
这个问题有一个警告。大约 90% 的列名与属性名匹配。这就是我挂断电话的地方。示例:在我返回数据行的数据库中,有一个名为 Date_Created 的字段,我的对象的属性在数据库中称为 Created_Date 或 Modified_By,在对象属性中称为 Update_By。 (我不能重命名属性或表,所以简单的答案是不可能的)。
我尝试这样做的原因是因为我的公司代码从数据库中获取数据返回弱类型数据集,当我们更新或向数据库添加数据时,我们必须填充一个自定义类并将其传递给更新过程.
我有什么方法可以比较数据行列并与对象属性进行比较或在运行时为数据行分配新的列名?
private static T CopyRecord<T>(DataRow record, dynamic newRecord)
{
//Get Properties
var properties = newRecord.GetType().GetProperties();
var column = 0;
foreach (PropertyInfo property in properties)
{
//If property is generic list, continue
if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) continue;
//Check for dbnull, return null if true, or convert to correct type
var columnValue = Convert.IsDBNull(record[column]) ? null : Convert.ChangeType(record[column], Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
//Set property for newRecord
property.SetValue(newRecord, columnValue);
column++;
}
return newRecord;
}
编辑:在这种情况下使用自定义属性会起作用吗?我可以在我的类属性前面加上等效的数据库列名。这样,我可以在自定义类和弱类型数据行上使用反射并匹配所有数据。
【问题讨论】:
-
请记住在您的标签中包含相关语言。
-
我以为我有,但我将动态更改为运行时。
标签: c# object reflection copy runtime