麻烦使用自定义对象迭代通用列表

时间:2009-06-30 02:19:05

标签: c#

以下是代码:

    ProductList products = xxx.GetCarProducts(productCount);
    List<CarImageList> imageList = new List<CarImageList>();


    foreach(Product p in products)
    {
        string imageTag = HttpUtility.HtmlEncode(string.Format(@"<img src=""{0}"" alt="""">", ImageUrl(p.Image, false)));

        imageList.Add(new CarImageList{ImageTag = imageTag});
        i++;
    }

在封面下,ProductList实际上是这样定义的:

public class ProductList : List<Product>
{
    static Random rand = new Random();

    public ProductList Shuffle()
    {
        ProductList list = new ProductList();
        list.AddRange(this);

        for (int i = 0; i < list.Count; i++)
        {
            int r = rand.Next(list.Count - 1);
            Product swap = list[i];
            list[i] = list[r];
            list[r] = swap;
        }

        return list;
    }

    public Product FindById(int id)
    {
        foreach (Product p in this)
            if (p.Id == id) return p;

        return null;
    }

    public Product GetRandom()
    {
        int r = rand.Next(this.Count - 1);
        return this[r];
    }
}

那么当我尝试通过ProductList实例进行预告时,为什么会出现错误?

无法将'xxx.Product'类型转换为'产品'是我得到的错误。但是,如果ProductList真的是List,为什么世界上会出现转换问题?

4 个答案:

答案 0 :(得分:1)

我认为您的xxx.GetCarProducts(productCount);可能会返回对List<Product>的引用,该引用的定义不如您的ProductList类,这意味着在您的GetCarProducts方法中,您可能会执行新的List<Product> new ProductList()

如果有什么可以张贴GetCarProducts

的正文

答案 1 :(得分:0)

在我看来,在第二个示例的上下文中,第一个示例的上下文中的ProductProduct类型不同,而不是Product。你确定你的命名空间已经整理好了吗?

答案 2 :(得分:0)

听起来你有两个不同的类,都叫做“Product”,但是在不同的命名空间/类中。 (公共)嵌套类是一个坏主意,因为它们会加剧这类问题......我会检查你对Product的引用实际上是同一个类。

修改

void Main()
{
    ProductList products = new ProductList();
    products.Add(new Product("foo"));
    products.Add(new Product("bar"));

    foreach(Product p in products)
    {
        Console.WriteLine(p.Name);
    }
}

// Define other methods and classes here
public class ProductList : List<Product>
{ /* [snip] the other stuff is irrelevant */ }

public class Product 
{
    public Product(string name)
    { Name = name; }
    public string Name;
}

答案 3 :(得分:0)

您可能在不同的命名空间中有两种不同的Product类型,或者您可能缺少using语句。

另外,自定义集合类(例如ProductList)应该继承自System.Collections.ObjectModel.Collection<T>