合并匿名类型

如何合并两个匿名类型,以便结果包含两个源对象的属性?

var source1 = new { foo = "foo", bar = "bar" } var source2 = new { baz = "baz" } var merged = Merge(source1, source2) // <-- here's where the magic should happen // merged: // { // foo = "foo", // bar = "bar", // baz = "baz" // } 

所以,这就是我最终提出的建议(受@ BlueMonkMN的回答启发):

 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; 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; } 
 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 Merge(T1 t1, T2 t2) { return new MergedType(t1, t2); } } class MergedType : DynamicObject { T1 t1; T2 t2; Dictionary members = new Dictionary(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); } } } 

你不能。 你最接近的将是:

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

请记住,匿名类型是在编译时创建的。 它不像是“动态”类型。 您可以在.NET 4中使用ExpandoObject ,但它与具有所有相关属性的匿名类型不完全相同。

以下适用于.NET 3.5(也可能是2.0)。 我修改了davehauser的答案。

  public static object MergeJsonData(object item1, object item2) { if (item1 == null || item2 == null) return item1 ?? item2 ?? new object(); var result = new Dictionary(); 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; }