2013-08-07 54 views
-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,它是給我每個支撐值作爲一個字符串一次一個以相同的順序通過串行(使用/ 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等)指定下一個屬性。

有沒有辦法做到這一點?

戴夫

回答

-1

您可以使用如下的東西...

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()); 
} 
+0

華麗! (更重要的是,因爲在慢慢閱讀之後,我真的明白了!)一個更正tho,我實際上無法將ReadLine()放入SetValue中...... ReadLine生成的字符串不值得深入字節類型,所以在SetValue中使用它之前,我必須對ReadLine val進行一些預處理。 – davecove

+0

很高興聽到!耶,我的壞!我應該添加一個便條。我的意思是代碼只是試圖告訴你如何去做! – Prash

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

我能想到的幾種解決方案,各有自己的優點和缺點(排名不分先後)

  1. 使用多個陣列來存儲您的變量和類型的數組知道往哪裏放你得到的第n個結果。

  2. 使用反射來獲取所有相關屬性並進行修改。但 - 讓他們一次存儲他們,不要每次都拿到他們。不要依賴訂單(http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx) - 創建您自己的訂單屬性並標記您的屬性。所以當你有一個你的選擇的命令,當你重命名或刪除一個屬性(或MS將改變.net)時不會改變。

  3. 使用對象數組來存儲數據,但使用正確的類型從字符串中解析每個數據。然後你可以讓你的屬性包裝數組。

    公共字節ALS
    {
    得到
    {
    回報(字節)m_properties [ALS_INDEX];
    }
    設置
    {
    m_properties [ALS_INDEX] =值;
    }
    }

相關問題