使用存储在string中的C#对象初始值设定语法实例化匿名对象

DSO*_*DSO 9 c# dynamic

使用C#对象初始化程序语法我可以实例化一个匿名对象,如下所示:

object empData = new { name = "bob", age = 30, salary = 100000 };
Run Code Online (Sandbox Code Playgroud)

但是,如果我将初始值设定项存储在字符串中,例如:

string init = "{ name = \"bob\", age = 30, salary = 100000 }";
Run Code Online (Sandbox Code Playgroud)

什么是将此字符串转换为对象实例的最佳方法?

Col*_*ett 17

匿名类是C#语法糖(参见此处的备注部分).csc.exe创建一个具有私有字段和读/写属性的类,其类型从上下文推断出来.再次推断出对象的所有用途.

这意味着您无法在运行时创建匿名类,因为CLR看到它们与任何其他类没有什么不同(同样,因为它是C#语法糖).

所以与其:

  • 用一个 Dictionary<string,object>
  • 使用JSON.NET,XML或类似的东西,它具有一些已经定义的方案来解析字符串以获取对象.然而,这需要对属性进行明确定义.
  • 用于System.Reflection.Emit在运行时创建类型,但我认为这不仅仅是一个真正的好处Dictionary<string,object>

我也担心你正在做什么,因为这对于我来说很可能意味着你接受某种用户输入.无论你做什么,都要警惕安全问题.


BFr*_*ree 5

使用匿名类型是不可能的,但是你可以使用TypeBuilder类,特别是TypeBuilder.Create(..)来使用Reflection Emit.

http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.createtype.aspx


Rob*_*vey 5

最好的方法是使用序列化。但是,当然,它不会使用您描述的相同字符串格式。

您的对象初始值设定项不必包含常量值。

string myName="bob";
int myAge=30;
double mySalary=100000;

object empData = new { name = myName, age = myAge, salary = mySalary };
Run Code Online (Sandbox Code Playgroud)

因此,在您的方案中,您将必须从字符串中解析出各个元素,并对它们执行一些转换,以将其强制转换为所需的类型。

如果您不喜欢这种特殊的字符串格式,则可以序列化和反序列化对象,并使用XML轻松完成相同的事情。