代码之家  ›  专栏  ›  技术社区  ›  Richard Ev

将包含属性的两个对象合并为一个对象

  •  1
  • Richard Ev  · 技术社区  · 15 年前

    如果我有两个物体, foo bar ,使用对象初始值设定项语法延迟…

    object foo = new { one = "1", two = "2" };
    
    object bar = new { three = "3", four = "4" };
    

    是否可以将它们组合成一个单独的对象,看起来像这样…

    object foo = new { one = "1", two = "2", three = "3", four = "4" };
    
    3 回复  |  直到 13 年前
        1
  •  7
  •   Jon Skeet    15 年前

    不,你不能这样做。编译时有两个独立的类型,但在执行时需要第三个类型来包含属性的联合。

    我是说,你 能够 使用中的相关新类型创建新程序集…但是无论如何,您将无法“正常”地从代码中引用它。

        2
  •  3
  •   grenade    15 年前

    正如其他人所说,按照您的描述进行操作并不方便,但如果您只想对组合属性进行一些处理:

    Dictionary<string, object> GetCombinedProperties(object o1, object o2) {
        var combinedProperties = new Dictionary<string, object>();
        foreach (var propertyInfo in o1.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            combinedProperties.Add(propertyInfo.Name, propertyInfo.GetValue(o1, null));
        foreach (var propertyInfo in o2.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            combinedProperties.Add(propertyInfo.Name, propertyInfo.GetValue(o2, null));
        return combinedProperties;
    }
    
        3
  •  1
  •   Paul Turner    15 年前

    假设没有命名冲突,则可以使用反射来读取对象的属性并将其合并为单个类型,但如果不对其执行反射,则无法在代码中直接访问此类型。

    在4.0中, dynamic 关键字,在代码中引用动态类型会容易得多。这并不能使它成为更好的解决方案,记住。