什么's相当于Javascript's C#中的Object.assign()
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 };
Javascript的原型继承,实际上只是链接对象。所以那里不存在继承(古典(。
看看这个视频,它很有启发性:继承与组合
using Newtonsoft.Json;
.
.
.
var newFoo = JsonConvert.DeserializeObject<Foo>(JsonConvert.SerializeObject(oldFoo));
问候,Oli
相关文章:
- 如何使用object.assign()从其他对象引用基本对象属性
- Object.assign(),函数方法和内存使用
- 是否可以使用Object.assign来克隆带有其方法的对象
- 何时需要使用Object.assign()方法来复制对象的实例
- 将函数参数传递给Object.assign
- javascript Object.assign() functionality
- “Object.assign()”polyfill中“Object(target)”的用途是什么
- Javascript Object Composition with assign & Object.creat
- Object.assign 和 just as assign 之间的区别
- 由 Object.Assign() 函数生成的复制对象具有副作用
- 使用 Object.create() 和 Object.assign() 创建对象有什么区别?
- 使用object.assign()添加到对象中的getter发现闭包变量的值错误
- 使用Object.assign和class/extends有什么区别
- Object.assign()更改顺序
- Object.assign()创建深层副本还是浅层副本
- Object.assign未按预期工作
- Object.assign保留对原始对象的引用
- Ecma6,Object.assign 不做深度复制
- 使用Object.assign和Object.create进行继承
- 从另一个对象扩展而不使用object.JavaScript中的assign (ES6特性)