0

我收到来自客户端回发的两个变量,它们匹配“字段名”和“值”。字段名可能是我在 db 表列中拥有的 50 个字段之一。

我将如何使用反射来识别哪个回发字段名与表中的字段匹配,然后使用 LINQ 更新传回的值更新该单个字段?

(string fieldid, string fieldvalue)

更新: 我查看了动态选择和更新 LINQ 结果集中的列值

而不是在页面上设置特定的文本框,我需要将反射变量字段的值写回数据库?这是我希望了解更多信息的地方。

4

1 回答 1

1

如果在编译类型时您的源名称和目标名称都不知道,那么您可以使用反射来读取和设置值,例如类似

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

显然,使用这样的东西会影响性能。

于 2012-08-23T22:06:05.220 回答