1

次のような値を持つファイルがあります。

[Params]
Version=106
Monitor=0
SMode=10000000
Date=20120519

私のアセンブリには、次のようなこれらのフィールドに対応するプロパティがあります。

public static string Version { get; set; }
public static string Monitor { get; set; }
public static string SMode { get; set; }
public static DateTime Date { get; set; }

私は次のようにファイルを繰り返し処理しています (_params は、ファイルの [Params] セクションからの行を含む文字列リストです)。

foreach (string s in _params)
{
    string[] values = s.Split('=');

}

値[0]の変数を見つけて、値[1]で設定するにはどうすればよいですか?

編集:

アッティラのおかげで、これが私の解決策になりました。ファイル内のテキストでプロパティ フィールドを見つけ、ファイルから値を設定しています。また、プロパティのデータ型に基づいて正しい型を設定しています。一部の文字列を変換して、DateTime データ型に変換する必要があります。

foreach (string s in _params)
{
    string[] values = s.Split('=');

    object myObject = values[0];
    object myValue = values[1];

    if (myObject.ToString() == "Date")
        myValue = ConvertDateStringToDateTime(values[1]);
    if (myObject.ToString() == "StartTime")
        myValue = ConvertStartTimeStringToDateTime(values[1]);
    if (myObject.ToString() == "Length")
        myValue = ConvertLengthStringToTimeSpan(values[1]);

    var type = typeof(HrmParams);
    var field = type.GetProperty(myObject.ToString());

    myValue = Convert.ChangeType(myValue, field.PropertyType);

    field.SetValue(myObject, myValue, null);            
}
4

2 に答える 2

2

リフレクションを使用するか(コンパイル時に名前が不明な場合でも、実行時にオブジェクトの名前に基づいてオブジェクトのメンバーにアクセスできるようにする)、ファイル内の既知の有効な値の名前とデリゲートの間にマッピングを作成する必要があります。適切な変数にアクセス(更新など)します。

最初のアプローチ(リフレクション)はより一般的ですが、同時に、ファイル内の値名と変数へのアクセスを接続するときにコンパイラー/コードアシスタントが利用できないため、正しく理解するのが困難です。

2番目のアプローチはエラーが発生しにくいですが(コンパイラーはエラーにフラグを立てることができます)、マッピングで明示的に指定した値の名前のみを処理するように制限されます。つまり、有効な値の名前が有効な場合は、マッピングを更新することを忘れないでください。ファイルの変更(新しい変数を追加したり、名前を変更したりするなど)

上記の2つのハイブリッドのような、さらに別の方法は、変数をマッピングに格納することです(すべての変数が同じタイプ(例string)であると仮定します)。このようにして、ファイルから値の名前を確認できます。マッピングに対して。欠点は、コード内から変数にアクセスするときに、コンパイラがタイプミス(または名前の変更)を発見するのを支援できないことです。

于 2012-05-26T12:26:10.273 に答える
1

単純な switch ステートメントが機能する可能性があります。

foreach (string s in _params) {
  string[] values = s.Split('=');

  switch (values[0]) {
    case "Version":
      Version = values[1];
      break;
    case "Monitor":
      Monitor = values[1];
      break;
    case "SMode":
      SMode = values[1];
      break;
    case "Date":
      Date = values[1];
      break;
  }
}
于 2012-05-26T12:38:47.743 に答える