かなり複雑なエンティティを表すPOCOにバインドされたページに複雑なフォームがあります。要件の1つは、ぼかし時にデータベースを更新することです。
現在、プロパティ(キーとして)、値、およびCampaignIdをajax経由で渡しています。キーは次のようになりますCampaign.FanSettings.SocialSharing.FacebookLinkText
。
私は以下のコードを使用していて、「近づいています」。私の最後のpropertyToSetは、FacebookLinkTextが設定されていないことです。これobject source
は、タイプがEntities.Campaignであるのに対し、私object value
は単なる文字列であるためです。これらは同じタイプである必要があることは理解していますが、その方法がわかりません。2つの質問:
- 以下のコードを変更して、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);
}