Merging anonymous types

前端 未结 4 456
孤街浪徒
孤街浪徒 2020-12-08 06:47

How can I merge two anonymous types, so that the result contains the properties of both source objects?

var source1 = new
{
    foo = \"foo\",
    bar = \"ba         


        
相关标签:
4条回答
  • 2020-12-08 07:12

    The following works in .NET 3.5 (and probably 2.0 as well). I modified davehauser's answer.

        public static object MergeJsonData(object item1, object item2)
        {
            if (item1 == null || item2 == null)
                return item1 ?? item2 ?? new object();
    
            var result = new Dictionary<string, object>();
            foreach (System.Reflection.PropertyInfo fi in item1.GetType().GetProperties().Where(x => x.CanRead))
            {
                var Value = fi.GetValue(item1, null);
                result[fi.Name] = Value;
            }
            foreach (System.Reflection.PropertyInfo fi in item2.GetType().GetProperties().Where(x => x.CanRead))
            {
                var Value = fi.GetValue(item2, null);
                result[fi.Name] = Value;
            }
            return result;
        }
    
    0 讨论(0)
  • 2020-12-08 07:19

    So here's, what I finally came up with (inspired by @BlueMonkMN's answer):

    public dynamic Merge(object item1, object item2)
    {
        if (item1 == null || item2 == null)
            return item1 ?? item2 ?? new ExpandoObject();
    
        dynamic expando = new ExpandoObject();
        var result = expando as IDictionary<string, object>;
        foreach (System.Reflection.PropertyInfo fi in item1.GetType().GetProperties())
        {
            result[fi.Name] = fi.GetValue(item1, null);
        }
        foreach (System.Reflection.PropertyInfo fi in item2.GetType().GetProperties())
        {
            result[fi.Name] = fi.GetValue(item2, null);
        }
        return result;
    }
    
    0 讨论(0)
  • 2020-12-08 07:19

    You can't. The closest you could come would be:

    var merged = Tuple.Create(source1, source2);
    
    Console.WriteLine(merged.Item1.foo);
    Console.WriteLine(merged.Item1.bar);
    Console.WriteLine(merged.Item2.baz);
    

    Bear in mind that anonymous types are created at compile-time. It's not like they're "dynamic" types. You could use ExpandoObject in .NET 4 for that, but it's not quite the same as an anonymous type with all the relevant properties in.

    0 讨论(0)
  • 2020-12-08 07:28
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Dynamic;
    
    namespace ConsoleApplication1
    {
      class Program
      {
         static void Main(string[] args)
         {
            var source1 = new
            {
                foo = "foo",
                bar = "bar"
            };
    
            var source2 = new
            {
               baz = "baz"
            };
    
            dynamic merged = Merge(source1, source2);
    
            Console.WriteLine("{0} {1} {2}", merged.foo, merged.bar, merged.baz);
         }
    
         static MergedType<T1, T2> Merge<T1, T2>(T1 t1, T2 t2)
         {
            return new MergedType<T1, T2>(t1, t2);
         }
      }
    
      class MergedType<T1, T2> : DynamicObject
      {
         T1 t1;
         T2 t2;
         Dictionary<string, object> members = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);
    
         public MergedType(T1 t1, T2 t2)
         {
            this.t1 = t1;
            this.t2 = t2;
            foreach (System.Reflection.PropertyInfo fi in typeof(T1).GetProperties())
            {
               members[fi.Name] = fi.GetValue(t1, null);
            }
            foreach (System.Reflection.PropertyInfo fi in typeof(T2).GetProperties())
            {
               members[fi.Name] = fi.GetValue(t2, null);
            }
         }
    
         public override bool TryGetMember(GetMemberBinder binder, out object result)
         {
            string name = binder.Name.ToLower();
            return members.TryGetValue(name, out result);
         }
      }
    }
    
    0 讨论(0)
提交回复
热议问题