在c#中是否有jQuery扩展?
var _Contact = new ContactLstModel { ContactName="xxxxxx",EmailAddr="yyyyyy",ContactNo="ddddddd",SelectedContactType="dddd" }; var _ContactOption= new ContactLstModel{ ContactType= new List<SelectListItem>(){ new SelectListItem{ Text="sss",Value="ddd" } } }; 正如你所看到的,它们都是同一型号的ContactLstModel.现在我如何将两者合二为一? 就像在jQuery中一样,我们有$.extend(dest,source); C#中有等价物吗? 解决方法
在C#和.NET 4.5中没有内置的等效$.extend.
但是,您可以找到很多人尝试使用.NET中的反射来实现这种行为的示例.还有其他人使用序列化(JSON.NET等)来实现类似的行为.另一种方法是使用像Automapper这样的IOC容器. 以下是使用Automapper IOC将第一个对象合并到第二个对象的示例: var expr = Mapper.CreateMap<ContactLstModel,ContactLstModel>().ForMember("ContactType",(conf) => { conf.Ignore(); }); var merged = Mapper.Map<ContactLstModel,ContactLstModel>(_Contact,_ContactOption); 使用Automapper,您可以控制如何将每个属性从源映射到目标. 如果您不想要外部库依赖项,并且想要完全控制,则可以使用纯反射方法. 例如,您可以使用与此link中的CopyValues方法类似的内容,并使用反射将第二个对象属性与第一个对象属性合并. CopyValues<ContactLstModel>(_Contact,_ContactOption); 因此,这行代码会将ContactType属性值从第二个对象复制到第一个对象中. CopyValues使用反射循环遍历对象的属性: public static void CopyValues<T>(T target,T source) { Type t = typeof(T); var properties = t.GetProperties().Where(prop => prop.CanRead && prop.CanWrite); foreach (var prop in properties) { var value = prop.GetValue(source,null); if (value != null) prop.SetValue(target,value,null); } } 当然,这并不支持jquery扩展所做的一切(合并,浅层和深层克隆到新对象等),但它可以满足您当前的需求.您可以扩展这些原则并构建更全面的解决方案. 但是请记住,C#不是像Javascript这样的语言,在C#中进行反射的成本要高得多,而在Javascript中,原型的属性可以通过廉价的for-in迭代或者调用Object来列出. .keys(). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |