我在页面上有一个复杂的表单,该表单绑定到代表一个相当复杂的实体的 POCO。要求之一是,在模糊时,我更新数据库。
我目前正在通过 ajax 传递属性(作为键)、值和 CampaignId。密钥可能类似于:Campaign.FanSettings.SocialSharing.FacebookLinkText
.
我正在使用下面的代码,并获得“关闭”。我的最后一个 propertyToSet 是 FacebookLinkText 没有被设置,因为我object source
的类型是 Entities.Campaign,而我object value
的只是一个字符串。我知道这些需要是相同的类型,但我不明白该怎么做。两个问题:
- 如何修改下面的代码才能执行 propertyToSet.SetValue 方法
- 由于我将它转换为一个对象,我看不到它实际上会如何更新我的实体,所以当我调用 SaveChanges 时,它会适当地更新。我错过了什么?
谢谢!
代码:
public void UpdateCampaign(int id, string key, string value)
{
using (var context = new BetaEntities())
{
var camp = context.Campaigns.Where(e => e.Id == id).Single();
SetProperty(camp, key,value);
}
}
public void SetProperty(object source, string property, object value)
{
string[] bits = property.Split('.');
for (int i = 0; i < bits.Length - 1; i++)
{
PropertyInfo prop = source.GetType().GetProperty(bits[i]);
source = prop.GetValue(source, null);
}
PropertyInfo propertyToSet = null;
if (source is IEnumerable)
{
foreach (object o in (source as IEnumerable))
{
propertyToSet = o.GetType().GetProperty(bits[bits.Length - 1]);
break;
}
}
else
{
propertyToSet = source.GetType().GetProperty(bits[bits.Length - 1]);
}
propertyToSet.SetValue(source, value, null);
}