2016-05-29 3 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形式であなたの車のオブジェクトのシリアル化されたバージョンが含まれます:

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

をそして、あなたは戻っているJSON文字列から、あなたのオブジェクトを再作成したい場合

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

Demo

:これを使用しますあなたではなくXMLを使用したい場合は0

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); 
} 
あなたはより頻繁にこの形式を使用する必要がある場合はもちろん Deserializerあなた自身を構築することができ

See it in action on dotNetFiddle

:テキストファイルの内容に従うことで

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

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

は、次のように使用することができ:

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"); 
関連する問題