【问题标题】:Create anonymous object by Reflection in C#在 C# 中通过反射创建匿名对象
【发布时间】:2010-09-11 22:57:39
【问题描述】:

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

稍后编辑以阐明用例

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

【问题讨论】:

    标签: c# silverlight reflection anonymous-objects


    【解决方案1】:

    这里是另一种方式,看起来更直接。

    object anon = Activator.CreateInstance(existingObject.GetType());
    

    【讨论】:

    • 如果要创建与现有对象不同的类型怎么办?
    • @AlexHopeO'Connor: CreateInstance 接受Type 对象,因此您可以将其传递给任何Type。例如Activator.CreateInstance(typeof(string)).
    【解决方案2】:

    是的,有。 凭记忆:

    public static T create<T>(T t)
    {
        return Activator.CreateInstance<T>();
    }
    
    object anon = create(existingAnonymousType);
    

    【讨论】:

    • 谢谢,这看起来是唯一简单的方法。但不是一件很简单的事情。
    • 回过头来看,这将简单地与现有AnonymousType 的编译时类型相关联,而不是其运行时类型,因为省略泛型参数的语法糖是编译时工件。换句话说,如果它被定义为对象,您将创建一个对象实例。
    【解决方案3】:

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

    编辑:感谢 Sklivvz 指出我回答了一个没有被问到的问题;)

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

    【讨论】:

    • 我认为他的意思是:当没有声明类型时
    • 谢谢,这听起来可行……但是,这适用于 silverlight 应用程序吗?不确定那里是否有 CodeDOM 的东西。
    【解决方案4】:

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

    根据您想要做什么,Castle 框架的动态代理对象可能也很合适。

    【讨论】:

    • 谢谢,听起来很有趣。但是,对我来说可能不行,因为我打算在 Silverlight 应用程序中使用它。
    【解决方案5】:

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

    如果您决定选择这条路线,我建议您下载Reflection Emit Language Addin for .NET Reflector,因为这可以让您了解如何使用 Reflection.Emit 构建现有的类,因此是学习此一角的好方法框架。

    【讨论】:

    • 谢谢,这是可行的,但我相信它可能无法与现有的匿名类一起使用。
    【解决方案6】:

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

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

    回复迈克尔的评论: 如果你没有类型 T 的类型实例,你总是可以从 typeof(T) 中得到它。如果您有一个未知类型的对象,您可以在其上调用 GetType() 以获取 Type 实例。

    【讨论】:

    • 它的问题是我没有 Type 实例。但是感谢您的提示,无论如何都值得一看。
    • 是的,GetType 是有道理的。所以看起来我只需要为每个对象创建一个示例并稍后复制它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多