假设用户修改了他的个人资料记录,其中包含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()方法。
答案 0 :(得分:1)
我做了类似的事情,但使用了string和object类型的自定义对象。我也不知道这是否有效,但它完成了工作。为了演示我使用了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);
}
}
答案 1 :(得分:0)