C# 访问对象属性而不强制转换为类型

C# 访问对象属性而不强制转换为类型,c#,linq,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,

我使用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;
}
我没有预定义的类来将对象强制转换到它

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

谢谢你在用C#4吗?您可以尝试使用
动态

foreach(dynamic s in St)
{
    string name = s.Name;
}
当然,风险在于,如果您试图访问对象没有的属性,您只会在运行时发现


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

C#3.0具有允许隐式强制转换的类型。

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

您可以使用以下命令

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添加到类中

@TimSchmelter:TL;医生:你能,并不意味着你应该。:)@GeorgeDuckett:是的,我认为jon的标题是不言自明的:“可怕的grotty hack:返回匿名类型实例”它仍然是强类型的(var foo=new foo()
的类型是
foo
),但不能使用它返回值。它也是隐式类型,而不是强制转换。