2016-11-16 58 views
0

我對究竟是如何工作原理有點困惑。我有一個IEnumerable<T>列表,我從MySQL數據庫中的存儲過程中提取。IEnumerable to Object?

 IEnumerable<CheckInVar> CheckInVars = context.Database.SqlQuery<CheckInVar>(
      "Call getCheckinVars(\"WEB\")").ToList(); 

現在,我需要遍歷這個對象退出屬性,這樣我可以使用它們像這樣?

foreach (var prop in CheckInVars.GetType().GetProperties()) 
     { 

      Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(CheckInVars, null)); 
     } 

或者可我直接關閉該IEnumberable<CheckInVar>對象的工作,或者我需要轉換,要使用它?

public class CheckInVar 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    [Column("ID")] 
    public int ID { get; set; } 
    public string Code { get; set; } 
    public string VarValue { get; set; } 
    public string AccessMethod { get; set; } 
    public string Active { get; set; } 
    public string DateCreated { get; set; } 
    public string DateUpdated { get; set; } 
    public string UpdatedBy { get; set; } 
} 
+0

什麼是'CheckInVar'的定義是什麼? – Christos

+8

只需直接引用您的CheckInVars類,絕對沒有理由在這裏進行反思:'foreach(CheckInVars中的var civ){...}' – Amy

+1

如果可以的話,您正在發射導彈殺死蚊子:) @Amy是對的,你不必使用反射 – Jaya

回答

1

是。

如果由於某種原因,希望通過反射來訪問每個集合(IEnumerable的)項目的屬性,那麼你將不得不通過IEnumerable的循環,並依次處理每個項目。

使用你的例子:

foreach(var checkInVar in CheckInVars) 
{ 
    foreach(var prop in checkInVar.GetType().GetProperties()) 
    { 
     Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(checkInVar)); 
    } 
} 

正如其他人雖然提到過,是真的有必要反思?你不能直接訪問屬性?

我猜你可能會使用反射來允許更改CheckInVar類型,而無需改變你的處理代碼。

0

要回答這個問題,「我是否需要循環這個對象」的答案是肯定的。但正如艾米所解釋的那樣,還有更好的辦法。

請注意,CheckInVars可能由無或許多Checkinvar組成。我

2

嘗試使用的foreach:

IEnumerable<CheckInVar> CheckInVars = context.Database.SqlQuery<CheckInVar>(
    "Call getCheckinVars(\"WEB\")").ToList(); 

foreach(CheckInVar item in CheckInVars) 
{ 
    Console.WriteLine("ID: " + item.ID.ToString()); 
    Console.WriteLine("Code: " + item.Code); 
    Console.WriteLine("VarValue: " + item.VarValue); 
    //.... 
}