代码之家  ›  专栏  ›  技术社区  ›  Michael Pliskin

在C语言中通过反射创建匿名对象#

  •  10
  • Michael Pliskin  · 技术社区  · 16 年前

    有没有办法在.NET3.5运行时通过反射创建C#3.0匿名对象?我希望在序列化方案中支持它们,因此我需要一种以编程方式操作它们的方法。

    一个额外的限制是,我将在Silverlight应用程序中运行所有这些,因此额外的运行时不是一个选项,也不确定动态生成代码将如何工作。

    6 回复  |  直到 16 年前
        1
  •  3
  •   TraumaPony    16 年前

    从内存:

    public static T create<T>(T t)
    {
        return Activator.CreateInstance<T>();
    }
    
    object anon = create(existingAnonymousType);
    
        2
  •  3
  •   Guvante    16 年前

    这是另一种方式,似乎更直接。

    object anon = Activator.CreateInstance(existingObject.GetType());
    
        3
  •  1
  •   Serafina Brocious    16 年前

    使用反射获取类型,对类型使用GetConstructor,对构造函数使用Invoke。

    实际问题的答案是:我发现生成C#代码,然后使用CodeDomProvider(但不是CodeDOM本身——很糟糕),然后向下编译并从中反映类型是在运行时执行“匿名”对象的最简单方法。

        4
  •  1
  •   Mendelt    16 年前

    您可能需要查看DLR。我自己还没有这样做过,但是DLR(动态语言)的用例听起来很像您正在尝试做的。

        5
  •  1
  •   Chris Ballard    16 年前

    您可以使用Reflection.Emit动态生成所需的类,尽管编写代码非常麻烦。

    如果你决定这条路线,我建议你下载 Reflection Emit Language Addin .NET Reflector ,因为这允许您了解如何使用Reflection.Emit构建现有类,因此是学习框架这一部分的好方法。

        6
  •  1
  •   Kolappan N t-clausen.dk    5 年前

    您可能还需要查看FormatterServices类: MSDN entry on FormatterServices

    它包含将创建类的空实例的GetSafeUninitializedObject,以及在执行序列化时的几个其他方便的方法。