C#中JavaScript的Object.assign()的等价物是什么

1l5u6lss  于 2023-01-11  发布在  Java
关注(0)|答案(4)|浏览(180)

如果我有一个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 };

如何从两个对象复制值,以创建包含foo1foo2值的Foo的新示例?
在Javascript中,这就像下面这样简单

var foo3 = Object.assign({}, foo1, foo2);
20jt8wwn

20jt8wwn1#

你可以创建一个通过反射合并对象的方法。2但是要注意,这是很慢的,并且通常不能在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);
qybjjes1

qybjjes12#

没有直接的方法,但你可以用这种方法来满足你的要求.

var foo3 = new Foo() {a = foo1.a, b = foo2.b };
iqjalb3h

iqjalb3h3#

Vivek的答案是正确的。因为Object.Assign是继承与组合讨论的一部分。这在javascript中并不那么简单,在javascript中你需要Object.Assign,但是在C#中你可以在你自己的类中组合一个类,只需示例化它并使它成为一个属性。你真的一直在做这件事。
Javascript有它的原型继承,你实际上只是链接对象,所以继承(经典的)在那里不存在。
看看这段视频,很有启发性:Inheritance vs Composition

xhv8bpkk

xhv8bpkk4#

using Newtonsoft.Json;
.
.
.

var newFoo = JsonConvert.DeserializeObject<Foo>(JsonConvert.SerializeObject(oldFoo));

问候你,奥利

相关问题