将linq对象的属性设置为另一个的属性

时间:2014-11-22 02:45:23

标签: c# linq reflection

我从数据库中提取了一个复杂的对象/实体,它有50-60个字段。我手工制作了一个表格,这是一个痛苦的屁股。我不想现在编写c#代码来手动应用每个属性。

我以为我能做到这一点

using (DataContext db = new DataContext())
{
    var _contact = db.Contact.Where(x => x.ID == model.Contact.ID).FirstOrDefault();
    _contact = model.Contact;
    db.SaveChanges();
}

但是,这不会更新对象。我想在设置_contact = model.Contact

时,对原始内容的引用会丢失

我在这个解决方案(或变体)上找到了很多类似的线程:

var notNullProps = typeof(Contact).GetProperties()
                   .Where(x => x.GetValue(model.Contact, null) != null);
foreach (var p in notNullProps)
{
    p.SetValue(_contact, p.GetValue(model.ContactWithMetaData.Contact, null), null);
}

然而,这总是会引发错误Non-static method requires a target

我甚至尝试使用AutoMapper,即使我的对象属于同一类。它似乎也失去了对象的引用。现在已经很晚了,我可能会做些蠢事。有人可以帮忙吗?

更新

我的AutoMapper代码:

Mapper.CreateMap<Contact, Contact>();
Mapper.Map(model.ContactWithMetaData.Contact, _contact);
db.SaveChanges();

更新2:

对不起伙计们。事实证明我做一些愚蠢的事情。我用model.Contact填充了我的表单,但省略了Contact.ID的隐藏字段。因此,Contact.ID_contact都是空的。现在我已经看到了我的错误,我已经回去测试了。上述两种方法都有效,而wahwahwah的方法也有效。

抱歉浪费每个人的时间!

2 个答案:

答案 0 :(得分:0)

通过执行_contact = model.Contact;,您将_contact的整个引用替换为model.Contact的引用。 _contact引用的原始对象没有变化,因此无需保存。

答案 1 :(得分:0)

我认为这可能会有所帮助:

public void SetProperties(object source, object target)
{
    var contactType = target.GetType();
    foreach (var prop in source.GetType().GetProperties())
    {
        var propGetter = prop.GetGetMethod();
        var propSetter = contactType.GetProperty(prop.Name).GetSetMethod();
        var valueToSet = propGetter.Invoke(source, null);
        propSetter.Invoke(target, new[] { valueToSet });
    }
}

仅当两个对象的属性完全相同时才有效(区分大小写)。不像AutoMapper那样健壮......