合并多个 C# 对象

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,但他们都知道类的类型,我只是在运行时找到了它。怎么可能呢?

Ale*_*lex 5

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)

请注意,如果类型具有相同的属性名称,您将需要某种机制来解决属性冲突。

  • @Lasse Vågsæther Karlsen,谢谢!好点子。有很多细微差别需要考虑。这只是一个开始。 (5认同)
  • “什么也没返回”,你是如何验证的?根据您的代码,它给了我一个完美的“ExpandoObject”,所有属性和值都完好无损。您是如何得出“不返回任何内容”的? (2认同)