如何访问存储在对象列表中的对象属性c#

时间:2013-04-21 15:58:56

标签: c#

我试图找出你是否可以访问添加到列表(对象)的对象,如下所示:

public class nearshop_data
{
    public String r_name { get; set; }
    public String r_desc  { get; set; }
    public  String loc_lat  { get; set; }
    public  String loc_lon  { get; set; }
}

然后按照

添加到该列表
shop_data = new nearshop_data();
lo = new List<object>();

for (int i = 0; i < count; i++) {

    shop_data.r_name = stuff.results[i].name;
    shop_data.r_desc = stuff.results[i].vicinity;
    shop_data.loc_lat = stuff.results[i].geometry.location.lat;
    shop_data.loc_lon = stuff.results[i].geometry.location.lng;

    lo.Add(shop_data);       

} 

然后我想在另一个类中检索,在后面的代码中说,这里它都失败了...因为我实际上无法访问该对象的属性

关于如何重写代码或使用什么的任何想法?

我猜测当我在我的代码后面获取该列表的实例时,让我们说它在索引0处检索它仍然装箱(或者我错了吗?) - 我依稀记得这样的事情是在java中完成的< / p>

2 个答案:

答案 0 :(得分:4)

我认为问题在于您使用的是List<object>而不是List<nearshop_data>,这实际上是装箱的类型。

如果你需要保持这样,你需要将对象强制转换为适当的类型:

nearshop_data firstElement = (nearshop_data)lo[0];

或者最好首先使用List<nearshop_data>

此外,因为nearshop_datareference type,并且您只实例化一次,所以每次只将指针添加到同一个shop_data实例。这意味着你只会得到一个元素,其值等于最后一个循环迭代的值。

答案 1 :(得分:1)

您需要将列表中的项目转换回特定的类:

 nearshop_data myitem = lo[0];

当然,您可能需要在尝试演员之前检查打开的类型(否则会抛出异常)。你可以这样做:

if (lo[0] is nearshop_data) 
{
    // do your cast here
}

或:

nearshop_data myitem = lo[0] as nearshop_data;

if (myitem != null)
{
    // myitem is a nearshop_data instance
}

当然,更好的方法是在通用列表中使用更具体的类。 List<object>实际上并不比旧ArrayList更有用。如果您只需要nearshop_data项,那么只需使用List<nearshop_data>即可。如果您需要一个异构列表,那么只需使用最具体的基类(或接口)来覆盖您需要存储的所有项目。