有没有办法在运行时从字符串填充对象的属性?任何可以帮助的图书馆? 举例来说,我有这个课程:
public class TestObject
{
public string Property1 { get; set; }
public int Property2 { get; set; }
public TestObject2 TestObject2 { get; set; }
}
public class TestObject2
{
public string Property1 { get; set; }
}
在我的实际案例中,该类还有其他几个子类,数组和其他数据类型。 我需要从文本,文件,列表中填充属性,其内容如下:
TestObject.Property1 = "String Value"
TestObject.Property2 = 5
TestObject.TestObject2.Property1 = "Sub Property String"
我看到的一种可能是扫描文本并使用Reflection分配值/对象。但在我寻找已经存在的东西之前。
答案 0 :(得分:0)
我喜欢Newtonsoft Json库(http://james.newtonking.com/json)。我相信还有很多其他的图书馆,但这是我用过的并且很满意的。
你班级的输出看起来像是:
{
"Property1":"Hello World",
"Property2":42,
"TestObject2":
{
"Property1":"Sub Hello World!"
}
}
执行此操作的代码只是Newtonsoft.Json.JsonConvert.SerializeObject(test)
,返回对象的代码是:TestObject test2 = Newtonsoft.Json.JsonConvert.DeserializeObject<TestObject>(jsonString);
答案 1 :(得分:-1)
考虑使用Roslyn(虽然它仍然是CTP),可以轻松完成:
var testObject = new TestObject();
testObject.Property1 = "Value1";
testObject.Property2 = 44;
testObject.TestObject2 = new TestObject2();
testObject.TestObject2.Property1 = "NestedValue1";
var scriptEngine = new ScriptEngine();
scriptEngine.AddReference(typeof(TestObject).Assembly);
var session = scriptEngine.CreateSession(new HostObject() { TestObject = testObject });
session.Execute("TestObject.Property1 = \"Value2\"");
session.Execute("TestObject.TestObject2.Property1 = \"Sub Property String\"");
var test1 = testObject.Property1 == "Value2"; // true
var test2 = testObject.TestObject2.Property1 == "Sub Property String"; // true
带一个小助手类:
public class HostObject
{
public TestObject TestObject { get; set; }
}