2013-11-27 110 views
1

有沒有一種方法可以在運行時從字符串填充對象的屬性?任何可以幫助的圖書館? 示範,我有這個類:從文本填充對象

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" 

一種可能性我看到的是席捲文本,並使用反射分配值/對象。但是在我尋找已經存在的東西之前。

+4

您是否考慮過使用序列化/反序列化(XML或JSON)? –

+0

您的文本文件格式是否已修復或者您是否允許決定您希望如何使用這些值來填充對象? –

+0

爲什麼你不想使用序列化?但是,如果您決定使用反射,那麼在[這個問題]中有我的例子(http://stackoverflow.com/questions/19936888/c-sharp-developing-net3-5-using-reflection-to-get-set -values-to-nested-properti/19938840#19938840)它是如何完成的 - 儘管代碼是用於getter的,但setter將非常​​相似。 –

回答

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

考慮使用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; } 
} 
+0

爲什麼downvote?它的工作原理,解決了這個問題,並且使用Reflection更清潔。而@bodee無法改變這種格式,所以沒有辦法。 –