有没有办法在.NET 3.5中通过Reflection在运行时创建C#3.0匿名对象?我想在我的序列化方案中支持它们,所以我需要一种以编程方式操作它们的方法。
稍后编辑以澄清用例
额外的限制是我将在Silverlight应用程序中运行所有这些,因此额外的运行时不是一个选项,并且不确定如何生成代码将如何工作。
答案 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实例。