如何使用LINQ中的Reflection更新单个字段值

时间:2012-08-23 12:30:48

标签: linq dynamic reflection lambda insert-update

我从客户端回发中收到两个匹配'fieldname'和'value'的变量。 fieldname可以是db表列中的50个字段之一。

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

(string fieldid, string fieldvalue)

更新: 我看过Dynamically select and update a column value in LINQ resultset

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

1 个答案:

答案 0 :(得分: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);
}

显然,使用类似的东西可以打击性能。