wak*_*i68 0 c# merge combinations object
我有两个这样的对象:
object obj1=new
{
ID=1,
Title="text",
Test= new Test(){
Number=20, IsSomething=false
}
}
object obj2=new
{
Age=22
}
Run Code Online (Sandbox Code Playgroud)
我想像这样以编程方式合并它们:
object obj3=new
{
ID=1,
Title="text",
Test= new Test(){
Number=20, IsSomething=false
},
Age=22
}
Run Code Online (Sandbox Code Playgroud)
请注意,可以启动每个类而不是 Test 类,我不知道我拥有对象中的哪个类,而我只是在运行时发现了这些对象。
我在 StackOverflow 中阅读了相同的问题,发现我应该使用 Reflection,但他们都知道类的类型,我只是在运行时找到了它。怎么可能呢?
static class MergeExtension
{
public static ExpandoObject Merge<TLeft, TRight>(this TLeft left, TRight right)
{
var expando = new ExpandoObject();
IDictionary<string, object> dict = expando;
foreach (var p in typeof(TLeft).GetProperties())
dict[p.Name] = p.GetValue(left);
foreach (var p in typeof(TRight).GetProperties())
dict[p.Name] = p.GetValue(right);
return expando;
}
}
Run Code Online (Sandbox Code Playgroud)
用法
var obj1 = new
{
ID = 1,
Title = "text",
Test = new Test()
{
Number = 20,
IsSomething = false
}
};
var obj2 = new
{
Age = 22
};
dynamic obj3 = obj1.Merge(obj2);
Console.WriteLine(obj1.ID.Equals(obj3.ID)); // True
Console.WriteLine(obj1.Title.Equals(obj3.Title)); // True
Console.WriteLine(obj1.Test.Equals(obj3.Test)); // True
Console.WriteLine(obj2.Age.Equals(obj3.Age)); // True
Run Code Online (Sandbox Code Playgroud)
请注意,如果类型具有相同的属性名称,您将需要某种机制来解决属性冲突。