2010-04-28 19 views
13

Ví dụ:Có cách nào để kết hợp các loại ẩn danh C#?

var hello = new { Hello = "Hello" }; 
var world = new { World = "World" }; 
var helloWorld = hello + world; 
Console.WriteLine(helloWorld.ToString()); 
//outputs {Hello = Hello, World = World} 

Có cách nào để thực hiện tác vụ này không?

+2

Big hình ảnh ..., gì bạn đang cố gắng để làm gì? – kervin

+0

Tôi đang sử dụng ASP.Net MVC và đã tìm thấy nó rất dễ dàng để trình bày các đối tượng ẩn danh trong định dạng Json sử dụng somethings như thế này: var posts = postService.GetPersonalPosts (1, 10, UserId); trả về Json (bài đăng, JsonRequestBehavior.AllowGet); và đã tự hỏi liệu có cách nào để dễ dàng kết hợp các thuộc tính từ hai loại ẩn danh thành một. –

Trả lời

8

Không. Xin chào và các đối tượng trên thế giới là đối tượng của các lớp khác nhau.

Cách duy nhất để hợp nhất các lớp này là sử dụng tạo kiểu động (Emit). Dưới đây là ví dụ về nối như: http://www.developmentalmadness.com/archive/2008/02/12/extend-anonymous-types-using.aspx

Trích dẫn từ bài viết đề cập:

Quá trình hoạt động như thế này: Đầu tiên sử dụng System.ComponentModel.GetProperties để có được một PropertyDescriptorCollection từ kiểu nặc danh. Cháy lên Reflection.Emit để tạo mới lắp ráp động và sử dụng TypeBuilder để tạo loại mới là tổng hợp của tất cả các thuộc tính tham gia. Sau đó, lưu bộ nhớ cache loại mới cho việc sử dụng lại để bạn không phải thực hiện lần truy cập khi tạo kiểu mới sau mỗi lần bạn cần.

+5

Tôi sẽ mạo hiểm rằng nếu bạn cần phải làm tất cả điều này cho loại điều này, bạn đang sử dụng các loại vô danh sai. –

+0

Tôi sẽ phải đồng ý với Lasse. Mặc dù đây có thể là giải pháp thú vị nhưng đó không phải là giải pháp hợp lý. Cảm ơn vì đã cho tôi biết điều đó là không thể. –

1

Không - Chúng là các loại khác nhau và toán tử + trên cả hai loại đó là không xác định.

Lưu ý: Tôi không nghĩ rằng bạn có nghĩa là concatenate. Trong C#, nối là một cái gì đó bạn làm cho hai hoặc nhiều hơn IEnumeration s mà đặt chúng "kết thúc để kết thúc". Ví dụ, phương pháp LINQ Concat() hoặc String.Concat() (chuỗi là "bộ sưu tập" của char). Những gì bạn mô tả trong câu hỏi của bạn giống như một phép nối hoặc nhiều thừa kế giữa hai loại không liên quan. Tôi không thể nghĩ ra bất cứ điều gì tương tự như trong C#, bên cạnh sử dụng các loại tự như trong phương án dưới đây:

var hello = new { Hello = "Hello" }; 
var world = new { World = "World" }; 
var helloWorld = new { hello, world }; 
Console.WriteLine(helloWorld.ToString()); 
//outputs { hello = { Hello = Hello }, world = { World = World } } 
+0

Ghép nối là từ tốt nhất tôi có thể tìm thấy để mô tả việc hợp nhất hai loại vô danh; mỗi người có "bộ sưu tập" riêng của các thành viên. –

1
var helloWorld = new { Hello = hello.Hello, World = world.World }; 

Bạn có thể viết một phương pháp mà thực hiện điều này tự động sử dụng phản chiếu API. Đó là gần như điều này như tôi thấy có thể.

0
var hello = new { Hello = "Hello" }; 
var world = new { World = "World" }; 
var z = new { x = hello, y = world }; 

chuyển nó sang bộ nối tiếp json và viola.

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