访问对象属性而不转换为类型

时间:2012-04-17 09:10:57

标签: c# linq

我正在使用LINQ to entity返回对象列表

            var st = personsList.Select(p => new
            {
                ID = p.Id,
                Key = p.Key,
                Name = p.Name,
                Address = p.Address,
                City = p.City,
                PhoneNumber = p.PhoneNumber
            })
            return st.ToList();

在我获得另一个类的列表后,我如何访问每个属性?

类似

foreach(object s in St)
{
    string name = s.Name;
}

我没有预定义的类来将对象强制转换为它。

这可以在不必创建类并将对象强制转换为该类类型的情况下完成吗?

由于

4 个答案:

答案 0 :(得分:8)

您使用的是C#4吗?您可以尝试使用dynamic

foreach(dynamic s in St)
{
    string name = s.Name;
}

当然,风险是,如果您尝试访问该对象没有的属性,您只能在运行时找到它。

顺便说一句,在这种情况下,实际创建一个具有所有这些属性的类是不是更有意义?您显然需要在几个地方使用它们,并且您将获得类型安全和编译时错误的好处。

答案 1 :(得分:3)

您可以使用以下

foreach(object s in St)
{
   Type type = s.GetType();
   PropertyInfo property = type.GetProperty("Name");
   if(property !=null)
   {
       string name= (string )property.GetValue(s, null);
   }
}

您必须将命名空间System.Reflection添加到类

答案 2 :(得分:0)

C#3.0具有var类型,允许隐式转换。

答案 3 :(得分:0)

编译器正在创建一个匿名类型,可以在方法范围内使用。如果你需要传递LINQ查询的结果,那么最好创建一个域对象来表示像PersonSummary这样的信息,并将查询结果分配给它。 C#是强类型的,利用它。