【发布时间】:2010-09-11 22:57:39
【问题描述】:
有没有办法在 .NET 3.5 中通过反射在运行时创建 C# 3.0 匿名对象?我想在我的序列化方案中支持它们,所以我需要一种以编程方式操作它们的方法。
稍后编辑以阐明用例
一个额外的限制是我将在 Silverlight 应用程序中运行所有这些,因此额外的运行时不是一个选项,并且不确定动态生成代码将如何工作。
【问题讨论】:
标签: c# silverlight reflection anonymous-objects
有没有办法在 .NET 3.5 中通过反射在运行时创建 C# 3.0 匿名对象?我想在我的序列化方案中支持它们,所以我需要一种以编程方式操作它们的方法。
稍后编辑以阐明用例
一个额外的限制是我将在 Silverlight 应用程序中运行所有这些,因此额外的运行时不是一个选项,并且不确定动态生成代码将如何工作。
【问题讨论】:
标签: c# silverlight reflection anonymous-objects
这里是另一种方式,看起来更直接。
object anon = Activator.CreateInstance(existingObject.GetType());
【讨论】:
CreateInstance 接受Type 对象,因此您可以将其传递给任何Type。例如Activator.CreateInstance(typeof(string)).
是的,有。 凭记忆:
public static T create<T>(T t)
{
return Activator.CreateInstance<T>();
}
object anon = create(existingAnonymousType);
【讨论】:
使用反射获取类型,对类型使用GetConstructor,对构造函数使用Invoke。
编辑:感谢 Sklivvz 指出我回答了一个没有被问到的问题;)
实际问题的答案:我发现生成 C# 代码,然后使用 CodeDomProvider(但不是 CodeDOM 本身——太糟糕了),然后将其编译下来并从中反映类型是执行“匿名”的最简单方法' 运行时的对象。
【讨论】:
您可能想要查看 DLR。我自己(还)还没有这样做,但 DLR(动态语言)的用例听起来很像您正在尝试做的事情。
根据您想要做什么,Castle 框架的动态代理对象可能也很合适。
【讨论】:
您可以使用 Reflection.Emit 动态生成所需的类,尽管编写代码很麻烦。
如果您决定选择这条路线,我建议您下载Reflection Emit Language Addin for .NET Reflector,因为这可以让您了解如何使用 Reflection.Emit 构建现有的类,因此是学习此一角的好方法框架。
【讨论】:
您可能还想查看 FormatterServices 类:MSDN entry on FormatterServices
它包含 GetSafeUninitializedObject 将创建该类的一个空实例,以及在进行序列化时其他几个方便的方法。
回复迈克尔的评论: 如果你没有类型 T 的类型实例,你总是可以从 typeof(T) 中得到它。如果您有一个未知类型的对象,您可以在其上调用 GetType() 以获取 Type 实例。
【讨论】: