根据参数创建动态/匿名类型

时间:2017-04-11 13:02:58

标签: c# .net

我尝试根据字符串参数创建匿名类型,例如

var propertyName = "Firstname";
var properyValue = "Fred";

我希望能够得到;

var myObj = new { FirstName = "Fred" };

但也有机会使用相同的功能并具有;

var propertyName = "Surname";
var properyValue = "Smith";
var myObj = new { Surname = "Smith" };

这实际上可行吗?

1 个答案:

答案 0 :(得分:1)

匿名类型在编译时定义。它们是普通的C#类型,只是没有名称[1]。因此,您无法根据运行时信息修改其结构。

看起来你根本不想要匿名类型,真的。 ExpandoObject听起来更像你想要的。匿名类型不应该从它们的范围中泄露 - 如果你遵循它,你就不需要像你想要的那样动态构造它们。

此外,在公开匿名类型时要小心。有一个原因是为什么它们不被允许用作方法参数和返回类型 - 这不是它们的设计目的。看来你使用dynamic来规避这个限制,但这有很多问题;它可以停止使用.NET的任何版本(包括修补程序),并且对于当前的.NET,如果将匿名类型泄漏到不应该的位置,它将导致可访问性错误(例如,internal匿名类型用于不同的装配)。

[1]当然,他们实际上有一个名字,因为CLR要求类型具有名称。但是这个名字是自动生成的并且有点隐藏,而不是你应该考虑的东西。