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

标签 javascript 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 };

我如何从这两个对象复制值来创建一个新的 Foo 实例,其中包含来自 foo1foo2 的值?

在 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/

相关文章:

javascript - 如何获取已加载样式表的内容

javascript - 无法识别传单上的颜色

javascript - 如何将 javascript 文件组织成更小的 block ?

c# - 在 IIS 7.5 上通过代理调用 WCF 时出现身份验证问题

c# where in with list 和 linq

c# - Linq 查询不返回任何内容

javascript - 在 GET 和 setState 之后无法读取数组,即使它在那里

javascript - 欺骗浏览器调用 JavaScript 事件?

c# - 装饰者模式与继承的例子

c# - 在 C# 中处理货币金额的最佳实践