2017-04-11 59 views
0

我试图创建一个基于字符串参数例如匿名类型动态/匿名类型,创建基于参数

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

我希望能够得到;

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

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

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

这实际上可行吗?

+0

您是否在寻找[ExpandoObject](https://blogs.msdn.microsoft.com/csharpfaq/2009/09/30/dynamic-in-c-4-0-introducing-the-expandoobject/)? –

+3

什么?不清楚你想要什么...使用'Dictionary '并且过得开心。 – xanatos

+0

也许看看'ExpandoObject',但你为什么要这么做?你可能有一个[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – juharr

回答

1

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

它似乎并不像你想要匿名类型,真的。 ExpandoObject听起来更像你想要的。匿名类型不应该从他们的范围中泄漏 - 如果你遵循这一点,你永远不需要像你想要的那样动态构建它们。

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

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