2016-05-29 40 views
1

我想填寫班級成員的文件中的值。
我正在創建這個文件,所以我可以根據需要選擇格式。我認爲這應該是這樣的,以易於閱讀:如何填寫文件中的班級成員

我有類「汽車」中包含「Car.a」,「Car.b」等
例如成員:

a,5 

應該給我

Car.a = 5; 

如何實現這一目標?

+5

你應該使用存在的東西,並且已經像XML,JSON等那樣做,而不是試圖重新發明輪子。 – Nasreddine

+0

它很可能會更容易使用像json或xml這樣的標準序列化。爲什麼你更喜歡你在問題中描述的格式? – faester

+0

這不是我喜歡這個,這是我的想法。如果有另一種方式來做到這一點,我會很樂意知道。 :) – Nowaczek

回答

0

既然你打開其他的方式來做到這一點,我建議使用類似Json.Net的東西來序列化/反序列化你的對象。這裏有一個簡單的例子:

Car car = new Car { a = 10, name = "Golf" }; 
var str = JsonConvert.SerializeObject(car); 

str將包含JSON格式的Car對象的序列化版本,看起來像這樣:

{"a":10,"name":"Golf"} 

如果你想重新創建對象從JSON字符串返回然後使用此:

Car deserializedCar = JsonConvert.DeserializeObject<Car>(str); 

Demo

如果你寧願使用XML:

var car = new Car { name = "Hellcat", a = 10 }; 
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(Car)); 
string carXml = null; 
using (var ms = new System.IO.MemoryStream()) 
{ 
    serializer.Serialize(ms, car); 
    carXml = System.Text.Encoding.UTF8.GetString(ms.ToArray()); 
} 

carXml將包含以下內容:

<?xml version="1.0"?> 
<Car xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <a>10</a> 
    <name>Hellcat</name> 
</Car> 
1

您可以使用Reflection做到這一點。類似於XmlSerializer做:

  • 解析屬性名和值
  • 確定財產
  • 的類型的字符串值轉換成你的財產的類型
  • 賦值

此示例適用於大多數基本數據類型:

private void AssignProperty(object obj, string propertyName, string propertyValue) 
{ 
    PropertyInfo property = obj.GetType().GetProperty(propertyName); 
    property.SetValue(obj, Convert.ChangeType(propertyValue, property.PropertyType), null); 
} 

See it in action on dotNetFiddle

你當然也可以建立自己的Deserializer如果你需要使用這種格式更加頻繁:

public class StringLinesDeserializer<T> where T : new() 
{ 
    public T Deserialize(string[] assignments) 
    { 
     T result = new T(); 

     foreach (string assignment in assignments) 
     { 
      int commaPos = assignment.IndexOf(','); 
      string propertyName = assignment.Substring(0, commaPos); 
      string propertyValue = assignment.Substring(commaPos + 1); 

      AssignProperty(result, propertyName, propertyValue); 
     } 

     return result; 
    } 

    private void AssignProperty(object obj, string propertyName, string propertyValue) 
    { 
     PropertyInfo property = obj.GetType().GetProperty(propertyName); 
     property.SetValue(obj, Convert.ChangeType(propertyValue, property.PropertyType), null); 
    } 
} 

可以使用這樣的:

string[] assignments = new string[]{"a,5","b,6"}; 
StringLinesDeserializer<Car> deserializer = new StringLinesDeserializer<Car>(); 
Car newCar = deserializer.Deserialize(assignments); 
0

通過下面的文本文件內容:

a,20
B,14

如果定義Car類如下:

public class Car 
{ 
    public object a { get; set; } 
    public object b { get; set; } 
} 

嘗試以下方法:

private Car GetCarFromFile(string strFilePath) 
{ 
    var lstCarFile = System.IO.File.ReadAllLines(strFilePath); 

    var car = new Car(); 
    foreach (var c in lstCarFile) 
    { 
     var name = c.Split(',')[0].Trim(); 
     var value = c.Split(',')[1].Trim(); 

     car.GetType().GetProperty(name).SetValue(car, value, null); 
    } 

    return car; 
} 

要調用提到的方法只是傳遞文本文件的路徑參數:

var car = GetCarFromFile("D:/CarMembersValue.txt");