2010-06-24 26 views
7

Có thể chiếu mọi thuộc tính của đối tượng và thêm nhiều hơn nữa mà không liệt kê tất cả các thuộc tính đó một cách cụ thể. Ví dụ, thay vì làm điều này:Chiếu đối tượng đầy đủ với các giá trị bổ sung trong LINQ

var projection = from e in context.entities 
        select new QuestionnaireVersionExtended 
        { 
         Id = e.Id, 
         Version = e.Version, 
         CreationDate = e.CreationDate, 
         ... 
         many more properties 
         ... 
         NumberOfItems = (e.Children.Count()) 
        }; 

Chúng ta có thể làm điều gì đó như thế này:

var projection = from e in context.entities 
        select new QuestionnaireVersionExtended 
        { 
         e, 
         NumberOfItems = (e.Children.Count()) 
        }; 

đâu nó sẽ mất tất cả tài sản từ điện tử có cùng tên, và thêm "NumberOfItems" bất động sản lên cái đó?

+0

Điều đó sẽ tuyệt vời ... tuy nhiên, tôi sẽ viết một cái gì đó như 'e. *' Thay vì chỉ 'e'. Nó sẽ đặc biệt hữu ích cho các loại vô danh –

Trả lời

3

Không thể thực hiện điều này. Mệnh đề select của một biểu thức LINQ cho phép các biểu thức C# bình thường tạo ra một giá trị. Không có cấu trúc C# nào sẽ tạo một đối tượng thông qua một bộ khởi tạo đối tượng theo kiểu kiểu mẫu như thế này. Bạn sẽ cần phải liệt kê các thuộc tính hoặc sử dụng một hàm tạo rõ ràng.

+0

@Reed, bỏ qua điều đó. Sẽ cập nhật câu trả lời của tôi. – JaredPar

1

Nếu bạn thêm một constructor để QuestionnaireVersionExtended mà có tổ chức cộng NumberOfItems của bạn, bạn có thể sử dụng các nhà xây dựng trực tiếp:

var projection = from e in context.entities 
    select new QuestionnaireVersionExtended(e, NumberOfItems = (e.Children.Count())); 

Có, tuy nhiên, không có cách nào để nói với trình biên dịch "chỉ cần sao chép tất cả các thuộc tính trên một cách rõ ràng. "

+0

Như Jarod chỉ ra, liệt kê các thuộc tính là những gì tôi đang cố gắng để tránh, bởi vì có tấn của họ. – CodeGrue

1

Có một số cách để bạn có thể thực hiện được điều này nhưng tất cả đều là những cơn ác mộng.

1.) quá tải một constructor và sao chép tất cả các giá trị đó (tuy nhiên đó là những gì bạn đang cố gắng để thoát khỏi.

2.) Sử dụng phản ánh để sao chép các thuộc tính trên (nhiều tác dụng phụ xấu, không được đề xuất)

3.) SỬ DỤNG MẪU TRANG TRÍ. Có vẻ như bạn đã thêm giá trị vào lớp gốc nên tôi nghĩ đây sẽ là thời điểm hoàn hảo để sử dụng một trang trí. Điều này cũng sẽ làm cho nó để như là tài sản được thêm vào họ không bỏ qua. Nó sẽ phá vỡ biên dịch, tuy nhiên giải pháp này không hoàn hảo nếu đối tượng được trang trí là sealed.

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