如果我有一个 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 };
我如何从这两个对象复制值来创建一个新的 Foo
实例,其中包含来自 foo1
和 foo2
的值?
在 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);
关于javascript - Javascript 的 Object.assign() 在 C# 中的等价物是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40402949/