使用 C# 对象初始化语法,我可以像这样实例化一个匿名对象:
object empData = new { name = "bob", age = 30, salary = 100000 };
但是如果我将初始值存储在一个字符串中,会怎样呢?例如:
string init = "{ name = \"bob\", age = 30, salary = 100000 }";
如何将这个字符串转换为对象的实例?
Dictionary<string,object>
System.Reflection.Emit
在运行时创建类型,但我认为这并没有比Dictionary<string,object>
更大的好处最好的方法是使用序列化。但当然,这不使用你描述的相同字符串格式。
您的对象初始化程序不必包含常量值。
string myName="bob";
int myAge=30;
double mySalary=100000;
object empData = new { name = myName, age = myAge, salary = mySalary };
在您的情况下,您需要从字符串中解析出各个元素,并对它们执行一些转换,以将它们强制转换为所需的类型。
如果您不坚持使用此特定字符串格式,则可以序列化和反序列化您的对象,并使用XML更轻松地完成相同的操作。
使用匿名类型是不可能的,但是可以使用反射发射和TypeBuilder类(特别是TypeBuilder.Create(..))实现。
http://msdn.microsoft.com/zh-cn/library/system.reflection.emit.typebuilder.createtype.aspx
没有直接简单的方法来实现。基本上,你有以下几个选项:
在我看来,以上选项都不是理想的选择。如果可以选择,建议考虑像Querystring、XML或JSON等有解析器可用的格式,同时考虑将数据存储在字典实例中,而不是为每个表达式创建一个对象。
我不认为这个问题本身能回答你的问题,但它会告诉你为什么不能使用字符串创建对象的匿名实例:
匿名类型没有任何公共字段,因此虽然您可以为命名对象执行此操作,但对于匿名类型来说并不那么简单。 话虽如此,没有什么能阻止您[如BFree所建议的]使用反射来发出匿名类型的MSIL - 这并不是非常简单,但也不是不可能。