通过C#中的Reflection创建匿名对象

时间:2008-09-22 09:42:11

标签: c# silverlight reflection anonymous-objects

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

稍后编辑以澄清用例

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

6 个答案:

答案 0 :(得分:3)

是的,有。 来自记忆:

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

object anon = create(existingAnonymousType);

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

使用反射来获取Type,在类型上使用GetConstructor,在构造函数上使用Invoke。

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

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

答案 3 :(得分:1)

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

根据您的想法,Castle-framework的动态代理对象也可能非常合适。

答案 4 :(得分:1)

你可以使用Reflection.Emit动态生成所需的类,虽然编码非常糟糕。

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

答案 5 :(得分:1)

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

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

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