【问题标题】:Merge Two Object Data合并两个对象数据
【发布时间】:2014-12-28 10:47:19
【问题描述】:

我有一个班级:

class MyClass {
  public string Text1 { get; set; }
  public string Text2 { get; set; }
  public string Text3 { get; set; }
}

还有两个对象:

var obj1 = new MyClass {Text1 = "Test1", Text2 = "Test2", Text3 = "Test3"};
var obj2 = new MyClass {Text3 = "Another Test"};

我想合并(覆盖 obj1 数据)这些对象,结果将是:

mergedObj => {Text1 = "Test1", Text2 = "Test2", Text3 = "Another Test"};

我有很多课。所以我想要一个方法来获取一个类的两个对象并返回结果。我怎样才能做到这一点?

【问题讨论】:

    标签: c# object merge


    【解决方案1】:

    这可行,但并不涵盖所有情况(仅复制公共属性,没有索引属性):

        class MyClass
        {
            public string Text1 { get; set; }
            public string Text2 { get; set; }
            public string Text3 { get; set; }
            public int Int1 { get; set; }
        }
    
        public static void Test()
        {
            var obj1 = new MyClass {Text1 = "Test1", Text2 = "Test2", Text3 = "Test3", Int1 = 0};
            var obj2 = new MyClass {Text3 = "Another Test", Int1 = 1};
    
            var obj3 = MergeObjects(obj1, obj2);
        }
    
        public static T MergeObjects<T>(T obj1, T obj2)
        {
            var objResult = Activator.CreateInstance(typeof(T));
    
            var allProperties = typeof(T).GetProperties().Where(x => x.CanRead && x.CanWrite);
            foreach (var pi in allProperties)
            {
                object defaultValue;
                if (pi.PropertyType.IsValueType)
                {
                    defaultValue = Activator.CreateInstance(pi.PropertyType);
                }
                else
                {
                    defaultValue = null;
                }
    
                var value = pi.GetValue(obj2, null);
    
                if (value != defaultValue)
                {
                    pi.SetValue(objResult, value, null);
                }
                else
                {
                    value = pi.GetValue(obj1, null);
    
                    if (value != defaultValue)
                    {
                        pi.SetValue(objResult, value, null);
                    }
                }
            }
    
            return (T)objResult;
        }
    

    【讨论】:

    • 感谢您的回复。我正在使用 Windows Phone 8.1 SDK。我收到错误“无法解析符号'GetProperties'”。这和WP SDK有关吗?
    • 尝试添加using System.Reflection并使用typeof(T).GetTypeInfo().GetDeclaredProperties()而不是typeof(T).GetProperties()
    • 谢谢,“IsValueType”呢...?
    • 使用“ pi.GetType().GetTypeInfo().IsValueType ”,它现在可以工作了。谢谢你的回答。
    • 啊哈,太好了!我没有办法测试手机应用程序,所以我不能自己尝试。
    猜你喜欢
    • 2022-12-15
    • 2021-03-08
    • 2020-02-04
    • 2015-01-26
    • 1970-01-01
    • 2021-09-12
    • 2012-04-25
    • 2017-03-30
    相关资源
    最近更新 更多