Irs*_*shu 3 .net c# asp.net asp.net-mvc 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"
}
}
};
Run Code Online (Sandbox Code Playgroud)
你可以看到两者都是同一型号ContactLstModel.现在我如何将两者合二为一?
就像在jQuery中一样,我们有 $.extend(dest,source);
C#中有等价物吗?
在C#和.NET 4.5中没有内置的等效$ .extend.
但是,您可以找到很多人reflection在.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);
Run Code Online (Sandbox Code Playgroud)
使用Automapper,您可以控制如何将每个属性从源映射到目标.
如果您不想要外部库依赖项,并且想要完全控制,则可以使用纯反射方法.
例如,您可以使用与此链接中的CopyValues方法类似的内容,并使用反射将第二个对象属性与第一个对象属性合并.
CopyValues<ContactLstModel>(_Contact, _ContactOption);
Run Code Online (Sandbox Code Playgroud)
因此,这行代码会将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);
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这并不支持jquery扩展所做的一切(合并,浅层和深层克隆到新对象等),但它可以满足您当前的需求.您可以扩展这些原则并构建更全面的解决方案.
但是请记住,C#不是像Javascript这样的语言,在C#中进行反射的成本要高得多,而在Javascript中,原型的属性可以通过廉价for-in迭代或者调用Object.keys 来列出( ).