1

次のようなクラスがあるとしましょう:

public class Config {
   public byte ALS { get; set; }
   public bool BCP { get; set; }
   public short NRG { get; set; }
   // 46 more bytes, shorts, and bools
   public byte GRT { get; set; }
}
Config myConfig = new Config();

同じクラスが定義された Arduino があり、シリアル経由で同じ順序で各 prop 値を一度に 1 つずつ文字列として送信しているとします (/n 文字を使用して、SerialPort.ReadLine() を使用できます)。それぞれの値が到着したら、次のプロパティに入れたいと思います。私は本当にこのようなことをしたいと思います:

<psudo code>
for (int i = 0; i < 50; i++)
{
    myConfig[i] = (Config[i].GetType())port.ReadLine();  //reference the property by index, not by name
}
</psudo code>

新しく到着した値を目的のプロパティ タイプに合わせてキャストした後、インスタンスの次のプロパティに新しい到着値を配置していることに注意してください。次のプロパティを名前 (ALS、BCP、NRG など) ではなく、インデックス (0、1、2、3 など) で指定します。

これを行う方法はありますか?

デイブ

4

3 に答える 3

2

いくつかの解決策が考えられますが、それぞれに長所と短所があります (順不同)。

  1. いくつかの配列を使用して変数を格納し、型の配列を使用して、取得した n 番目の結果をどこに配置するかを確認します。

  2. リフレクションを使用して、関連するすべてのプロパティを取得し、それらを変更します。しかし、一度取得して保管し、毎回取得しないでください。また、注文に依存しないでください ( http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx ) - 注文の独自の属性を作成し、プロパティをマークします。そのため、プロパティの名前を変更したり削除したりしても (または MS が .net を変更しても) 変更されない、選択した順序がある場合。

  3. オブジェクトの配列を使用してデータを保存しますが、正しい型を使用して文字列からそれぞれを解析します。その後、プロパティで配列をラップできます。

    public byte ALS
    {
    get
    {
    return (byte)m_properties[ALS_INDEX];
    }
    セット
    {
    m_properties[ALS_INDEX] = 値;
    }
    }

于 2013-08-07T05:34:27.297 に答える
2

以下のようなものを使用できます...

public class Config {
   [Display(Order=0)]
   public byte ALS { get; set; }

   [Display(Order=1)]
   public bool BCP { get; set; }

   [Display(Order=2)]
   public short NRG { get; set; }

   [Display(Order=3)]
   public byte GRT { get; set; }
}

属性DisplaySystem.ComponentModel.DataAnnotations名前空間からのものです

そして今、以下のように拡張メソッドを書くことができます

public static PropertyInfo GetProperty(this Type type, int index)
{
      return type.GetProperties().FirstOrDefault(p => ((DisplayAttribute)p.GetCustomAttributes(typeof(DisplayAttribute), false)[0]).Order == index);
}

これを使用して、以下に示すようにオブジェクトのフィールドに値を割り当てることができます

Config config = new Config();
for(int i = 0; i < 50; i++)
{
     config.GetType().GetProperty(i).SetValue(config, port.ReadLine());
}
于 2013-08-07T05:51:14.123 に答える
0

リフレクションを使用してプロパティを反復処理できます。これはインデックス付きアクセスを提供しませんが、プロパティは決定論的な順序で返されると思います。

Type type = obj.GetType();
BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
PropertyInfo[] properties = type.GetProperties(flags);

foreach (PropertyInfo property in properties)
{
    Console.WriteLine("Name: " + property.Name + ", Value: " + property.GetValue(obj, null));
}
于 2013-08-07T05:12:03.293 に答える