2016-11-16 82 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); 
    //.... 
}