2016-05-29 11 views
1

Ich möchte Klassenmitglieder mit den Werten aus einer Datei füllen.
Ich erstelle diese Datei, damit ich die Formatierung wählen kann, wie ich will. Ich dachte, dass es sein sollte so einfach zu lesen:So füllen Sie Klassenmitglieder aus Datei

Ich habe Klasse „Car“ mit Mitgliedern wie „Car.a“, „Car.b“ usw.
Zum Beispiel:

a,5 

Es sollte mir geben

Car.a = 5; 

Wie dies zu erreichen?

+5

Sie sollten etwas verwenden, das existiert und dies bereits tut, wie XML, JSON, etc, anstatt zu versuchen, das Rad neu zu erfinden. – Nasreddine

+0

Es wird wahrscheinlich einfacher sein, einige Standard-Serialisierung wie JSON oder Xml zu verwenden. Warum bevorzugen Sie das Format, das Sie in der Frage beschreiben? – faester

+0

Es ist nicht so, dass ich das bevorzuge, das ist die Idee, die ich habe. Wenn es einen anderen Weg gibt, dies zu tun, werde ich mehr als glücklich sein zu wissen. :) – Nowaczek

Antwort

0

Da Sie für andere Möglichkeiten offen sind, schlage ich vor, mit etwas wie Json.Net Ihre Objekte zu serialisieren/deserialisieren. Hier ist ein kurzes Beispiel:

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

str wird eine serialisierte Version Ihres Car-Objekt im JSON-Format enthalten, die wie folgt aussieht:

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

Und wenn Sie Ihr Objekt zurück von diesem JSON-String neu erstellen möchten diese dann verwenden:

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

Demo

Wenn Sie lieber XML verwenden würde:

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 enthält folgendes:

<?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

Sie Reflection verwenden können, das zu tun.Ähnlich wie XmlSerializer tut:

  • analysieren den Eigenschaftsnamen und Wert
  • bestimmen die Art der Immobilie
  • konvertieren den String-Wert, um Typ Ihrer Immobilie
  • weisen Sie den Wert

Dieses Beispiel funktioniert für die meisten grundlegenden Datentypen:

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

Sie können natürlich Ihre eigenen Deserializer bauen, wenn Sie dieses Format mehr verwenden müssen oft:

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

durch folgende Textdatei Inhalt:

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); 
    } 
} 

könnte wie folgt verwendet werden :

a, 20
b, 14

Wenn Sie Car Klasse wie folgt definiert:

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

Versuche folgende Methode:

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; 
} 

das genannte Verfahren einfach aufrufen Pfad Parameter der Textdatei übergeben:

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