1

假设用户修改了包含 FirstName、LastName、Email 等字段的个人资料记录。

对于每个被修改的字段,更改都以键值对的形式存储在类型列表中:

List<Tuple<string, object>>

此键值对中的键代表实际的表列。

在尝试更新记录时,这是一种方法:

foreach (Tuple<string, object> field in changeList) {
    if (field.Item1.equals("FirstName")) {
        user.FirstName = field.Item2;
    }
    if (field.Item1.equals("Email")) {
       user.Email = field.Item2;
    }
    ...
}

db.SaveChanges()

我认为必须有更好的方法来实现这一点。

我想我可以使用反射来设置用户的每个属性

foreach(tuple<string, object> field in changeList) {
  user.GetType().InvokeMember(field.Item1,
     BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
     Type.DefaultBinder, user, field.Item2);    
}

我想知道是否有更好的方法。也许我可以动态构建一个“var”对象,它也可以让我使用 TryUpdateModel() 方法。

4

2 回答 2

1

我做了类似的事情,但使用了字符串和对象类型的自定义对象。我也不知道这是否是有效的,但它可以完成工作。为了演示,我使用了 Tuple,其中第一个 item1 是字符串, item2 是一个对象。

List<Tuple<string, object>> listTuple = new List<Tuple<string, object>>();

listTuple.Add(new Tuple<string, object>("FirstName", "Foo"));
listTuple.Add(new Tuple<string, object>("LastName", "Bar"));


PropertyInfo[] props = user.GetType().GetProperties();
    foreach (var prop in props)
    {
      if (prop.PropertyType.Name == "ICollection`1")
      {
        //Do not do anything these are navigation properties in entity framework.
        //For eg. If User has Applications then do not set values for Applications.
      }
      else
        {
                //Match each property with matching Item1 in Tuple.
            var myTuple = listTuple.Where(x => x.Item1 == prop.Name).First();
            //Set Users Property using myTuple's Item2 which is an object here. 
            prop.SetValue(user, myTuple.Item2, null);
        }
    }
于 2013-10-13T23:26:34.017 回答
0

一种方法是使用老朋友 ADO.NET。

另一种方式是动态 LINQ

编辑

抱歉,我认为动态 LINQ 只能用于过滤。可能 ADO.NET 是最好的选择。我没主意了。

于 2013-10-13T22:15:18.840 回答