我想填寫班級成員的文件中的值。
我正在創建這個文件,所以我可以根據需要選擇格式。我認爲這應該是這樣的,以易於閱讀:如何填寫文件中的班級成員
我有類「汽車」中包含「Car.a」,「Car.b」等
例如成員:
a,5
應該給我
Car.a = 5;
如何實現這一目標?
我想填寫班級成員的文件中的值。
我正在創建這個文件,所以我可以根據需要選擇格式。我認爲這應該是這樣的,以易於閱讀:如何填寫文件中的班級成員
我有類「汽車」中包含「Car.a」,「Car.b」等
例如成員:
a,5
應該給我
Car.a = 5;
如何實現這一目標?
既然你打開其他的方式來做到這一點,我建議使用類似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);
如果你寧願使用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>
您可以使用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);
通過下面的文本文件內容:
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");
你應該使用存在的東西,並且已經像XML,JSON等那樣做,而不是試圖重新發明輪子。 – Nasreddine
它很可能會更容易使用像json或xml這樣的標準序列化。爲什麼你更喜歡你在問題中描述的格式? – faester
這不是我喜歡這個,這是我的想法。如果有另一種方式來做到這一點,我會很樂意知道。 :) – Nowaczek