2009-06-30 5 views
0

Hier ist der Code:Ärger Iterieren Generic Liste mit benutzerdefinierten Objekt

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++; 
    } 

Unter den Abdeckungen Product wirklich wie folgt definiert ist:

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]; 
    } 
} 

also warum ich den Fehler, wenn ich versuche zu foreach durch die ProductList-Instanz?

Kann den Typ 'xxx.Product' nicht in 'Product' konvertieren, ist der Fehler, den ich bekomme. Aber wenn ProductList wirklich List ist, warum würde es in der Welt ein Problem mit der Konvertierung geben?

+0

Was bedeutet GetCarProducts aussehen? Verwenden Sie LinqToSQL? Wenn dies der Fall ist, kann der Fehler in GetCarProducts auftreten, aber es wird nicht angezeigt, bis Sie versuchen, über die Auflistung zu iterieren. – tvanfosson

+0

GetCarProducts gibt den Typ ProductList zurück. Nein, nicht mit LINQ – PositiveGuy

+0

versuchte dies, aber kein Glück, sagt es nicht ProductList Produkte = GetCarProducts (productCount) konvertieren; Liste prods = Produkte; – PositiveGuy

Antwort

0

Es scheint mir, dass Product im Zusammenhang mit dem ersten Beispiel ein anderer Product Typ als Product im Zusammenhang mit dem zweiten Beispiel ist. Sind Sie sicher, dass Sie Ihre Namespaces aussortiert haben?

+0

sie sind vom gleichen Namespace – PositiveGuy

0

Es klingt wie Sie haben zwei verschiedene Klassen, beide "Produkt" genannt, aber in verschiedenen Namespaces/Klassen. (Öffentlich) verschachtelte Klassen sind eine schlechte Idee, weil sie diese Art von Problem verschärfen können ... Ich würde überprüfen, dass beide Referenzen auf Product tatsächlich die gleiche Klasse sind.

EDIT:

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; 
} 
+0

beide Referenzen auf Produkt sind definitiv auf die gleiche Klasse – PositiveGuy

+0

Der obige Code funktioniert perfekt für mich ... sind Sie sicher, es gibt keine Namespace Zusammenstöße? –

+0

Was vermuten Sie für andere als öffentlich verschachtelte Klassen? – PositiveGuy

0

Sie könnten zwei verschiedene Product Typen in unterschiedlichen Namensräumen haben, oder Sie könnten eine using Anweisung fehlen.

Nebenbei sollten benutzerdefinierte Auflistungsklassen (wie ProductList) von System.Collections.ObjectModel.Collection<T> erben.

+0

Sie haben den gleichen Namespace, also kein Problem. – PositiveGuy

+0

Was ist die genaue Fehlermeldung? Ist es zur Laufzeit oder zur Kompilierzeit? – SLaks

+0

Laufzeit: Kann nicht Typen ‚xxnamespace.ProductList‘ auf ‚System.Collections.Generic.List ‘ konvertieren – PositiveGuy

1

Ich denke, Ihr xxx.GetCarProducts(productCount); einen Hinweis auf List<Product> zurückkommen, die als Ihre ProductList Klasse weniger definiert ist, in Ihrer GetCarProducts Methode bedeutet, dass Sie wahrscheinlich tun, um neue List<Product> statt new ProductList().

Wenn etwas können Sie Beiträge verfassen, den Körper von GetCarProducts