在C#和.NET 4.5中沒有內置的$ .extend。
但是,您可以找到許多人在.NET中使用reflection
來嘗試實現這種行爲的示例。還有其他人使用序列化(JSON.NET等)來實現類似的行爲。另一種方法是使用IOC容器,如Automapper。
下面是一個例子如何將您的第一個對象合併到使用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中,原型的屬性可以通過廉價的迭代或通過調用Object.keys()。
反射比(以托馬斯Lycken答案等)專用於特定對象的方法要慢一點,讓較少的控制,但它實現了最通用的方法這個。 – AFract 2014-10-02 08:26:11
是的。 JQuery擴展自動合併屬性而不指定名稱,所以基於反射的方法可能是他可以獲得的最接近這種功能的方法。 – 2014-10-02 08:33:30
這很酷,很容易理解,謝謝你 – Irshu 2014-10-02 14:55:24