在c#中是否有jQuery扩展?

var _Contact = new ContactLstModel { ContactName="xxxxxx", EmailAddr="yyyyyy", ContactNo="ddddddd", SelectedContactType="dddd" }; var _ContactOption= new ContactLstModel{ ContactType= new List(){ new SelectListItem{ Text="sss",Value="ddd" } } }; 

正如你所看到的,它们都是同一型号的ContactLstModel 。 现在我如何将两者合二为一?

就像在jQuery中一样,我们有$.extend(dest,source);

C#中有等价的吗?

在C#和.NET 4.5中没有内置的等效$ .extend。

但是,您可以找到很多人尝试使用.NET中的reflection来实现这种行为的示例。 还有其他人使用序列化(JSON.NET等)来实现类似的行为。 另一种方法是使用像Automapper这样的IOC容器。

以下是如何使用Automapper IOC将第一个对象合并到第二个对象的示例:

 var expr = Mapper.CreateMap().ForMember("ContactType", (conf) => { conf.Ignore(); }); var merged = Mapper.Map(_Contact, _ContactOption); 

使用Automapper,您可以控制如何将每个属性从源映射到目标。

如果您不想要外部库依赖项,并且想要完全控制,则可以使用纯reflection方法。

例如,您可以使用与此链接中的CopyValues方法类似的内容,并使用reflection将第二个对象属性与第一个对象属性合并。

 CopyValues(_Contact, _ContactOption); 

因此,这行代码会将ContactType属性值从第二个对象复制到第一个对象中。

CopyValues使用reflection循环遍历对象的属性:

 public static void CopyValues(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#中进行reflection的成本要高得多,而在Javascript中,原型的属性可以通过廉价的for-in迭代或者对Object的调用来列出。 .keys()。

你可以使用扩展方法:

 public static class ContactModelExtensions { public static ContactModel Extend(this ContactModel first, ContactModel replacement) { if (!replacement.ContactsName.IsNullOrEmpty()) // or whatever criteria you want { first.ContactsName = replacement.ContactsName; } // similar assignment for all other properties return first; // since we return the first one, properties not set in override // will be untouched } } 

现在,你可以

 var extendedContact = _Contact.Extend(_ContactOptions); 

完成它。

你可以使用一些框架来做到这一点。 例如,使用ValueInjecter :

  public class NoNullsInjection : ConventionInjection { protected override bool Match(ConventionInfo c) { return c.SourceProp.Name == c.TargetProp.Name && c.SourceProp.Value != null; } } class A { public string a { get; set; } public string b { get; set; } } static void Main(string[] args) { A a1 = new A() { a = "123" }; A a2 = new A() { b = "456" }; A c = new A(); c.InjectFrom(new NoNullsInjection(),a1,a2); // "c" now have a="123", b="456" }