我收到来自客户端回发的两个变量,它们匹配“字段名”和“值”。字段名可能是我在 db 表列中拥有的 50 个字段之一。
我将如何使用反射来识别哪个回发字段名与表中的字段匹配,然后使用 LINQ 更新传回的值更新该单个字段?
(string fieldid, string fieldvalue)
更新: 我查看了动态选择和更新 LINQ 结果集中的列值
而不是在页面上设置特定的文本框,我需要将反射变量字段的值写回数据库?这是我希望了解更多信息的地方。
我收到来自客户端回发的两个变量,它们匹配“字段名”和“值”。字段名可能是我在 db 表列中拥有的 50 个字段之一。
我将如何使用反射来识别哪个回发字段名与表中的字段匹配,然后使用 LINQ 更新传回的值更新该单个字段?
(string fieldid, string fieldvalue)
更新: 我查看了动态选择和更新 LINQ 结果集中的列值
而不是在页面上设置特定的文本框,我需要将反射变量字段的值写回数据库?这是我希望了解更多信息的地方。
如果在编译类型时您的源名称和目标名称都不知道,那么您可以使用反射来读取和设置值,例如类似
public void SetField<T1, T2>(T1 destination, string destinationFieldName,
T2 source , string sourceFieldName)
{
FieldInfo destFi = typeof(T1).GetField(destinationFieldName);
FieldInfo sourceFi = typeof(T2).GetField(sourceFieldName);
if (sourceFi != null && destFi != null)
destFi.SetValue(destination, sourceFi.GetValue(source));
}
然后,如果您尝试将名为 NewName 的字段从设置(这是一个名为 Settings 的类的实例)复制到类型为 Table1 的记录的列名,那么您可以执行以下操作:
SetField<Table1, Settings<(record , "Name" , settings , "NewName");
如果您使用的是属性而不是字段,那么您需要使用 PropertyInfo 而不是 FieldInfo
public void SetProperty<T1, T2>(T1 destination, string destinationFieldName,
T2 source, string sourceFieldName)
{
PropertyInfo destPi = typeof(T1).GetProperty(destinationFieldName);
PropertyInfo sourcePi = typeof(T2).GetProperty(sourceFieldName);
if (sourcePi != null && destPi != null)
destPi.SetValue(destination, sourcePi.GetValue(source , null) , null);
}
显然,使用这样的东西会影响性能。