[英]What's the equivalent of Javascript's Object.assign() in C#
如果我有一個C#類
public class Foo
{
public int? a { get; set; }
public int? b { get; set; }
}
這個類的兩個實例
var foo1 = new Foo() { a = 1 };
var foo2 = new Foo() { b = 1 };
我怎樣才能復制兩個對象的值來創建一個包含foo1
和foo2
值的Foo
新實例?
在Javascript中,這將是如此簡單
var foo3 = Object.assign({}, foo1, foo2);
你可以創建一個通過反射合並對象的方法。 但要注意,這種速度很慢,通常不能在C#中使用。
必須小心跳過“空”屬性。 在您的情況下,這些是值類型。 在我的示例實現中,每個屬性都被跳過,如果它是該類型的默認值(對於int,這是0):
public T CreateFromObjects<T>(params T[] sources)
where T : new()
{
var ret = new T();
MergeObjects(ret, sources);
return ret;
}
public void MergeObjects<T>(T target, params T[] sources)
{
Func<PropertyInfo, T, bool> predicate = (p, s) =>
{
if (p.GetValue(s).Equals(GetDefault(p.PropertyType)))
{
return false;
}
return true;
};
MergeObjects(target, predicate, sources);
}
public void MergeObjects<T>(T target, Func<PropertyInfo, T, bool> predicate, params T[] sources)
{
foreach (var propertyInfo in typeof(T).GetProperties().Where(prop => prop.CanRead && prop.CanWrite))
{
foreach (var source in sources)
{
if (predicate(propertyInfo, source))
{
propertyInfo.SetValue(target, propertyInfo.GetValue(source));
}
}
}
}
private static object GetDefault(Type type)
{
if (type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}
用法:
var foo3 = CreateFromObjects(foo1, foo2);
沒有直接的方法,但你可以通過這種方式滿足你的要求。
var foo3 = new Foo() {a = foo1.a, b = foo2.b };
Vivek的答案是正確的。 因為Object.Assign是較大的繼承與組合討論的一部分。 這在javascript中並不是那么簡單,你需要Object.Assign,但是在C#中你可以通過實例化它並使它成為屬性來在你自己的類中組成一個類。 你真的這么做。
Javascript帶有原型繼承,你真的只是鏈接對象。 所以繼承(經典)並不存在。
看看這個視頻,它非常具有啟發性: 繼承與組合
using Newtonsoft.Json;
.
.
.
var newFoo = JsonConvert.DeserializeObject<Foo>(JsonConvert.SerializeObject(oldFoo));
問候,奧利
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.