2008-09-22 31 views
10

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

后编辑,以澄清使用情况

一个额外的约束是,我将运行所有它的Silverlight应用程序里面,所以额外的运行时间是不是一种选择,而不是知道如何在生成代码飞会起作用。

回答

3

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

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

使用反射来获取类型,该类型使用GetConstructor,在构造函数中使用调用。

编辑:感谢Sklivvz为指出,我回答说,不问了一个问题;)

回答实际问题:我发现生成的C#代码,然后使用CodeDomProvider(但不CodeDOM本身 - 很糟糕),然后将其编译并将其反映出来,这是在运行时执行“匿名”对象最简单的方法。

+0

我认为他的意思是:当没有声明类型 – Sklivvz 2008-09-22 09:49:01

+0

谢谢,这听起来是可行的......但是,这将工作的Silverlight应用程序?不知道CodeDOM的东西是否可用。 – 2008-09-22 12:55:07

1

你可能想看看DLR。我还没有这样做,但DLR(动态语言)的用例听起来很像你想要做的。

取决于你想要做的城堡框架的动态代理对象可能是一个不错的选择太多的东西。

+0

谢谢,听起来很有趣。不过,我打算在Silverlight应用程序中使用它,可能对我来说是不可行的。 – 2008-09-22 12:56:40

3

是的,有。 从内存:

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

object anon = create(existingAnonymousType); 
+0

谢谢,这看起来像唯一简单的方法..虽然不是一件很简单的事情。 – 2008-09-22 12:57:50

+0

回顾一下,这将简单地与existingAnonymousType的编译时类型相关联,而不是它的运行时类型,因为忽略通用参数的语法糖是编译时工件。换句话说,如果它被定义为对象,你将创建一个对象实例。 – Guvante 2008-10-08 11:03:32

1

您可以使用Reflection.Emit的动态生成所需的类,虽然这是非常讨厌的代码了。

如果你决定这条路线,我会建议你下载的Reflection Emit Language Addin,因为这可以让你看到如何使用Reflection.Emit构建现有的类,因此是学习这个框架的一个好方法。

+0

谢谢,这是可行的,但它可能不会与我相信现有的匿名类一起工作。 – 2008-09-22 12:58:25

1

你也可能想看看进入FormatterServices类:MSDN entry on FormatterServices

它包含GetSafeUninitializedObject做序列化时,将创建一个类的空实例,和其他几个方便的方法。

回复来自Michael的评论: 如果您没有类型T的Type实例,您可以随时从typeof(T)中获取它。如果你有一个未知类型的对象,你可以在其上调用GetType()以获得Type实例。