2012-12-24 46 views
10

Hi Tôi cần phải tìm một cách để tuyên bố một loại vô danh cho một method.This là mã của tôi:loại Return cho một danh sách

public List<var> ListOfProducts(string subcategory) 
{ 
    var products = (from p in dataContext.Products 
        join s in dataContext.SubCategories.Where(x => x.SubCatName == subcategory) 
         on p.SubcatId equals s.SubCatId 
        join b in dataContext.Brands on p.BrandId equals b.BrandId 
        select new 
        { 
         Subcategory = s.SubCatName, 
         Brand = b.BrandName, 
         p.ProductName, 
         p.ProductPrice 
        }); 
    return products; 
} 

Tôi không biết những gì loại I nên đặt danh sách cho Phương pháp.Tôi nên làm gì trong trường hợp này?

+2

Tôi nghĩ bạn không thể làm như vậy vì loại này là cục bộ cho phương pháp. Khai báo loại công khai mà những người khác thực sự có thể sử dụng. – poke

+2

Bạn sẽ sử dụng phương pháp này như thế nào? – SWeko

+2

Tôi đã trả lời câu hỏi này cho câu hỏi khác của bạn - bạn cần khai báo lớp học của riêng mình với các thuộc tính bạn muốn. Bạn đã không hiểu gì về bình luận trước đó của tôi? –

Trả lời

21

Bạn không thể trả lại Anonymous Type từ phương thức.

Chỉ cần tạo lớp cho loại của bạn và trả lại.

public class Product 
{ 
    string Subcategory { get; set; } 
    string Brand { get; set; } 
    string ProductName { get; set; } 
    decimal ProductPrice { get; set; } 
} 

Sau đó trở lại như vậy:

var products = (from p in dataContext.Products 
        join s in dataContext.SubCategories.Where(x => x.SubCatName == subcategory) on p.SubcatId 
         equals s.SubCatId 
        join b in dataContext.Brands on p.BrandId equals b.BrandId 
        select new Product 
           { 
            Subcategory = s.SubCatName, 
            Brand = b.BrandName, 
            p.ProductName, 
            p.ProductPrice 
           }); 

    return products; 

EDIT: Để làm rõ tuyên bố đầu tiên của tôi, như @JamesMichaelHare chỉ ra, về mặt kỹ thuật có thể trả về một loại vô danh từ một phương pháp bằng cách quay object hoặc dynamic , nhưng nó có thể phức tạp hơn nó có giá trị vì bạn phải sử dụng Reflection hoặc một số cách khác để truy cập các thuộc tính của đối tượng của bạn.

+0

Đây là cách tôi sẽ làm. – Gromer

+1

Cũng như làm rõ, bạn chính xác ở chỗ bạn không thể tạo kiểu trả về của một phương thức một kiểu ẩn danh, nhưng nó * là * có thể trả về các đối tượng ẩn danh từ một phương thức (như * object *, * dynamic *, v.v.) , mặc dù thực sự nếu đối tượng là phạm vi vượt quá phương pháp trong các loại ẩn danh suốt đời sẽ không được tốt nhất và một lớp tùy chỉnh là tốt hơn. Bạn đã nói đúng, chỉ muốn chắc chắn rằng họ đã không lấy nó để có nghĩa là các đối tượng vô danh mình không thể được trả lại ... –

9

Theo MSDN, loại động cho phép các hoạt động trong đó nó xảy ra để bỏ qua việc kiểm tra loại thời gian biên dịch. Thay vào đó, các hoạt động này được giải quyết trong thời gian chạy.

Vì vậy, Hãy thử điều này thay vì:

public IEnumerable<dynamic> ListOfProducts(string subcategory) 
4

Những gì tôi có thể nói, bạn nên xác định một mô hình khác cho điều này, nếu bạn sử dụng lại kết quả cho lớp Presentation, bạn nên xác định ViewModel, hoặc nếu bạn sử dụng cho lớp phân phối , bạn có thể xác định là đối tượng Dto

public class ProductDto 
{ 
    public string Subcategory {get; set; } 
    public string Brand { get; set; } 
    public string ProductName{ get; set; } 
    public decimal ProductPrice{ get; set; } 
} 
1

Chỉ cần lưu ý: các loại ẩn danh được thiết kế để sử dụng trong phạm vi phương thức (hoặc hàm) không nằm ngoài nó.

Nhưng có một cách để làm điều đó bằng một số phương pháp mở rộng và một số đúc thêm (Tôi không thích điều này):

(. Trong mã của bạn, bạn nên thêm ToList() để biểu thức LINQ của bạn quá)

phương pháp mở rộng là:

static List<T> InitList<T>(this T o) { return new List<T>(); } 
static T CastToThis<T>(this T target, object o) { return (T)o; } 

Bạn có thể khởi tạo một danh sách các loại vô danh bởi:

var list = new { Name = "Name", Age = 40 }.InitList(); 

Bây giờ cast đối tượng quay trở lại của phương pháp của bạn để loại danh sách này bằng cách sử dụng:

list = list.CastToThis(returnedValueOfYourMethod); 

Và một điều: các kiểu nặc danh có giá trị chỉ trong một lắp ráp và không thể được truyền qua các biên giới lắp ráp. Từ here:

Đặc tả C# đảm bảo với bạn rằng khi bạn sử dụng loại "ẩn danh" giống nhau ở hai vị trí trong một cụm, các loại hợp nhất thành một loại. Để được "giống nhau", hai loại ẩn danh phải có cùng tên thành viên và cùng một loại thành viên chính xác, theo thứ tự chính xác.

Tất cả trong tất cả, tôi không hiểu tại sao bạn cần làm điều đó vì tuyên bố loại mới là thực tế hơn và nếu bạn thực sự cần điều này, bạn nên xem xét loại động trong C# và nếu bạn định làm thêm những điều kỳ diệu bạn nên sử dụng sự phản chiếu.

Các vấn đề liên quan