首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#中Javascript的Object.assign()的等价物是什么

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

Stack Overflow用户
提问于 2016-11-03 21:38:05
回答 4查看 6.5K关注 0票数 8

如果我有一个C#类

代码语言:javascript
复制
public class Foo
{
    public int? a { get; set; }
    public int? b { get; set; }
}

和该类的两个实例

代码语言:javascript
复制
var foo1 = new Foo() { a = 1 };
var foo2 = new Foo() { b = 1 };

如何从这两个对象复制值以创建同时包含来自foo1foo2的值的Foo的新实例

在Javascript中,这很简单,如下所示

代码语言:javascript
复制
var foo3 = Object.assign({}, foo1, foo2);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-03 21:56:01

你可以创建一个通过反射合并对象的方法。但要注意,这很慢,并且通常不能在C#中使用。

必须注意跳过“空”属性。在您的例子中,这些都是值类型。在我的示例实现中,如果它是该类型的默认值,则跳过每个属性(对于int,默认值为0):

代码语言:javascript
复制
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;
}

用法:

代码语言:javascript
复制
var foo3 = CreateFromObjects(foo1, foo2);
票数 7
EN

Stack Overflow用户

发布于 2016-11-03 21:46:48

没有直接的方法可以做到这一点,但是你可以通过这种方式来满足你的需求。

代码语言:javascript
复制
var foo3 = new Foo() {a = foo1.a, b = foo2.b };
票数 2
EN

Stack Overflow用户

发布于 2017-03-28 20:20:56

Vivek的答案是正确的。因为Object.Assign是更大的继承与组合讨论的一部分。在javascript中,这不是那么简单,因为您需要Object.Assign,但是在C#中,您可以在自己的类中编写一个类,只需将其实例化并使其成为一个属性即可。你真的一直都在这么做。

Javascript的原型继承,你实际上只是链接对象。所以继承(经典)在那里是不存在的。

看看这个视频,它非常有启发性:Inheritance vs Composition

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40402949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档