2010-10-26 3 views
5

Tôi thường cần tăng thêm một đối tượng có thuộc tính chẳng hạn. Cho đến bây giờ (mệt mỏi của nó;) và nó xấu xí quá) Tôi đã làm theo cách này:Làm thế nào để tăng thêm đối tượng kiểu ẩn danh trong C#

var someListOfObjects = ...; 

var objectsWithMyProperty = from o in someListOfObjects 
          select new 
          { 
           o.Name, /* Just copying all the attributes I need */ 
           o.Address, /* which may be all of them. */ 

           SomeNewProperty = value 
          }; 

Có một cách thông minh để làm điều này? Những gì tôi đã làm trước đây là một cái gì đó như thế này:

var objectsWithMyProperty = from o in someListOfObjects 
          select new 
          { 
           OldObject = o,   /* I access all of the old properties from here */  
           SomeNewProperty = value 
          }; 

Tôi đoán điều này có thể được thực hiện với một số phản ánh, nhưng tôi tưởng tượng có một cách tiếp cận nhanh hơn mà làm cho một cái gì đó tương đương với phương pháp cồng kềnh đầu tiên.

Xin cảm ơn, Lasse

+0

Tôi đoán bạn có thể ăn một cây Biểu thức lạ mắt. Nhưng nó có lẽ sẽ không hoạt động cho Linq2SQL và bạn bè. – leppie

+0

Vấn đề với phương pháp thứ hai là gì? –

+0

@Pieter Tôi nghĩ rằng nó là xấu xí và không có ý nghĩa trong bối cảnh tôi sử dụng nó. Fx nếu bạn cung cấp nó như là một nguồn dữ liệu bạn kết thúc với 'Eval (" WhyDoIHaveToHaveANameHere.TheActualProperty ")'. –

Trả lời

3

Tôi nghĩ rằng những gì bạn đang tìm kiếm là một cái gì đó giống như ExpandoObject đã được thêm vào trong C# 4.0 cùng với các loại động

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

Bên trong nó sử dụng một từ điển để bạn có thể thêm/gỡ bỏ các thành viên năng động. Lần đầu tiên bạn cố gắng truy cập vào một thuộc tính như:

obj.NewProperty = newValue 

ExpandoObject sẽ tự động thêm từ khóa này vào từ điển nội bộ của nó.

Hy vọng điều này sẽ hữu ích.

+0

Bây giờ bạn đề cập đến 'ExpandoObject' tôi nhớ lại rằng tôi có tạp chí mà bạn liên kết đến. Tôi đã có thể ưa thích một giải pháp tĩnh nhưng năng động là tốt hơn không :) Cảm ơn ... –

4

Không có hỗ trợ cho việc thêm thuộc tính mới vào loại ẩn danh hiện có. Biểu thức kiểu ẩn danh chỉ có thể được sử dụng để tạo một loại vô danh mới với các thuộc tính được chỉ định. Hai lựa chọn thay thế tốt nhất cho việc thêm các thuộc tính mới là các lựa chọn được liệt kê trong câu hỏi.

+0

Đó là quá xấu: (Cảm ơn ... :) –