2015-10-21 5 views
0

продукт класса от структуры объектасписок новообращенного <baseclass> в List <DerivedClass>

public partial class Product 
{ 
    public int ProductID { get; set; } 
    public string ProductBarcode { get; set; } 
    public int CompanyID { get; set; } 
} 

создал производный класс

public class ProductPlus : Product 
{ 
    public bool Restock { get; set; } 
    public DateTime? DateSold { get; set; }   
} 

я получил данные из БД в списке

List<Product> lstProduct = (from p in entity.Product select p).ToList(); 

Я пробовал:

List<ProductPlus> lstProductPlus = lstProduct.Cast<ProductPlus>().ToList(); 

или

List<ProductPlus> lstProductPlus = lstProduct.ConvertAll(x => (ProductPlus)x).ToList(); 

Дает: Не удается привести объект типа 'продукта' к типу 'ProductPlus'.

var lstProductPlus = lstProduct.Select(item => item as ProductPlus).ToList(); 
var lstProductPlus = lstProduct.Select(item => new ProductPlus()).ToList(); 

дает: Точное количество записей, как в lstProduct, но все пустые

Кто-нибудь есть решение?

+0

Не все 'product' '' ProductPlus'es, поэтому вы не можете обновлять. Откуда берутся значения 'Resock' и' DateSold'? –

+0

Они будут вставлены после этого правилами и вычислениями – Dinand

+0

Метод расширения 'OfType ' используется здесь, а не 'Cast '. – Will

ответ

2

Почему вы унаследовали product класс? Я думаю, вы хотите добавить еще 2 поля в класс product, не так ли?

Поскольку автоматически сгенерированный класс является partial класса, вместо того, чтобы наследовать product класс, как ты, просто добавить еще один файл в разделяемый класс, как это:

public partial class Product 
{ 
    public bool Restock { get; set; } 
    public DateTime? DateSold { get; set; }   
} 
+0

Может быть, OP использует наследование по какой-то причине? Не использовать наследование не является допустимым ответом. – Paparazzi

+0

Я так не думаю. На всякий случай это проблема XY. – AnhTriet

+0

Thanx man, Вы видели причину проблемы и правильное решение. Достаточно сумасшедший, иногда я использую partitial, но слепым, чтобы увидеть это простое использование. – Dinand

2

Добавить конструктор в ProductPlus, который принимает Product в качестве аргумента.

public class ProductPlus 
{ 
    public ProductPlus() { } 

    public ProductPlus(Product p){ 
     SomeProduct = p; 
    } 

    public Product SomeProduct { get; set; } 
    public bool Restock { get; set; } 
    public DateTime? DateSold { get; set; }   
} 

Затем в код вызова:

var lstProduct = lstProduct.Select(item => new ProductPlus(item)); 
+0

Извините Бен, также попробовал, но дает: ProductPlus не содержит конструктор, который принимает 1 аргумент. Выше класса не принимает аргументов – Dinand

+1

Я не думаю, что модифицировать автоматически сгенерированный класс - хорошая идея. При изменении класса ваша модификация проиграет. – AnhTriet

+0

@Dinand Я обновил пример, чтобы включить продукт в качестве аргумента конструктора для ProductPlus. – BenM

2

Try,

List<ProductPlus> lstProductPlus = lstProduct.ConvertAll(x => new ProductPlus() 
{ 
    CompanyID = x.CompanyID, 
    ProductID = x.ProductID, 
    ProductBarcode = x.ProductBarcode 
}).ToList() 
+0

Я знаю, что с вами ответит, но если что-то в БД меняется, ... Так оно и работает, но это решение всех кошмаров. У меня будет чистота и динамичность. Но Thanx для вас ответит. – Dinand

0

Each ProductPlus - это продукт
Вы можете лить продукт в список продуктов

Но не каждый продукт является ProductPlus
Вы не можете бросить продукт в ProductPlus, если он уже не является ProductPlus

Рассмотрим класс

public class ProductDesign : Product 
{ 
    public DateTime? ProjectedCompletion date { get; set; }   
} 

испытано, просто попробовать его

{ 
    // ... 
    public void TestInheritance() 
    { 
     try 
     { 
      Product p01 = new Product() { ProductBarcode = "p01" }; 
      ProductPlus pp01 = new ProductPlus() { ProductBarcode = "pp01" }; 
      Product p02 = (ProductPlus)pp01; 
      //ProductPlus pp02 = (ProductPlus)p01; // throws a cast error 

      List<Product> productList = new List<Product>(); 
      productList.Add(p01); 
      productList.Add(pp01); 

      //List<ProductPlus> productPlusList = productList.ConvertAll(x => (ProductPlus)x).ToList(); // throws a cast error 

      List<ProductPlus> productPlusList = productList.Where(x => x is ProductPlus).ToList().ConvertAll(x => (ProductPlus)x).ToList(); 
      foreach (ProductPlus p in productPlusList) 
       Debug.WriteLine(p.ProductBarcode); // 1 item 

      List<ProductPlus> productPlusMajicList = productList.Select(x => new ProductPlus(x)).ToList(); 
      foreach (ProductPlus p in productPlusMajicList) 
       Debug.WriteLine(p.ProductBarcode); // majic 2 tiems 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.Message); 
     } 


    } 
} 
public partial class Product 
{ 
    public int? ProductID { get; set; } 
    public string ProductBarcode { get; set; } 
    public int? CompanyID { get; set; } 
    public Product() { } 
    public Product(Product p) 
    { 
     ProductID = p.ProductID; 
     ProductBarcode = p.ProductBarcode; 
     CompanyID = p.CompanyID; 
    } 
} 

public class ProductPlus : Product 
{ 
    public bool? Restock { get; set; } 
    public DateTime? DateSold { get; set; } 
    public ProductPlus() { } 
    public ProductPlus(Product p) : base(p) { } 
} 
Смежные вопросы