2009-05-22 40 views
7

Sử dụng C# đối tượng initializer cú pháp tôi có thể tạo một đối tượng vô danh như thế này:Instantiating đối tượng ẩn danh bằng C# đối tượng cú pháp khởi tạo lưu trữ trong chuỗi

object empData = new { name = "bob", age = 30, salary = 100000 }; 

Nhưng nếu tôi có initializer lưu trữ trong một chuỗi, ví dụ như:

string init = "{ name = \"bob\", age = 30, salary = 100000 }"; 

Cách tốt nhất để chuyển chuỗi này thành thể hiện của đối tượng?

Trả lời

16

Lớp ẩn danh là C# syntactic sugar (xem phần Ghi chú here). csc.exe tạo một lớp với các trường riêng và thuộc tính đọc/ghi với kiểu được suy ra từ ngữ cảnh. Tất cả việc sử dụng của đối tượng, một lần nữa, suy ra.Điều này có nghĩa là bạn không thể tạo ra một lớp vô danh trong thời gian chạy vì CLR thấy chúng không khác gì so với bất kỳ lớp nào khác (một lần nữa, bởi vì nó là C# cú pháp đường). Quay lại đầu trang |

Vì vậy, thay vì:

  • Sử dụng một Dictionary<string,object>
  • Sử dụng JSON.NET, XML hoặc một cái gì đó giống như nó có một số đề án đã được xác định để phân tích một chuỗi để có được một đối tượng. Điều này đòi hỏi các thuộc tính được xác định rõ ràng, tuy nhiên.
  • Sử dụng System.Reflection.Emit để tạo ra các loại tại thời gian chạy, nhưng tôi thấy không có lợi ích thực sự cho điều này qua chỉ là một Dictionary<string,object>

Tôi cũng có những lo ngại về những gì bạn đang làm vì đây là chuỗi phương tiện rất có khả năng với tôi rằng bạn chấp nhận đầu vào của người dùng thuộc loại nào đó. Hãy cảnh giác với các vấn đề an ninh trong bất cứ điều gì bạn làm.

+0

Argh ... bạn nói đúng, tôi biết về các lớp anon được tạo ra tại thời gian biên dịch nhưng bộ não của tôi không tạo kết nối (đoán cuối tuần dài là quá hạn). Ngoài ra mối quan tâm của bạn về bảo mật và đầu vào của người dùng chắc chắn là hợp lệ. Dù sao, lý do tôi đã làm điều này là bởi vì các API tôi đã gọi mất một đối tượng vô danh. Nhưng hóa ra tôi cũng có thể truyền vào một từ điển để giải quyết vấn đề cho tôi. Cảm ơn. – DSO

+0

Tôi hoàn toàn đồng ý. Tôi thích sử dụng XML rất nhiều bằng cách sử dụng sự phản chiếu để làm cho một số xml tùy chỉnh phức tạp. Nó không dành cho tất cả mọi người, nhưng nếu bạn đang thực hiện XML đơn giản, thì việc sử dụng tuần tự hóa XML XML là đủ: D – pqsk

2

Không có cách nào dễ dàng trực tiếp để thực hiện việc này. Về cơ bản, bạn có các tùy chọn sau:

  1. Phân tích chuỗi theo cách thủ công.
  2. Sử dụng trình biên dịch C# để biên dịch đối tượng đó như là một phần của hội đồng và sử dụng sự phản chiếu để tìm ra nội dung.
  3. (không chắc chắn nếu có thể, chỉ C# 4.0): Sử dụng các lớp trình biên dịch được quản lý C# 4.0 để phân tích biểu thức và suy ra nội dung.

Không cái nào trong số đó lý tưởng theo ý kiến ​​của tôi. Tôi xem xét QueryString như các cặp, XML hoặc JSON hoặc một số định dạng khác có các trình phân tích cú pháp sẵn có thay vào đó nếu bạn có tùy chọn và xem xét lưu trữ dữ liệu trong một cá thể từ điển thay vì tạo một đối tượng cho mọi biểu thức.

1

Tôi không nghĩ rằng câu hỏi này câu trả lời của bạn cho mỗi gia nhập, nhưng nó sẽ cho bạn biết lý do tại sao nó không thể tạo ra các trường hợp mang tính chất của các đối tượng sử dụng chuỗi trong một cách như bạn đề nghị:

How do I create and access a new instance of an Anonymous Class passed as a parameter in C#?

Các loại vô danh không có bất kỳ trường công cộng nào, do đó trong khi bạn có thể thực hiện việc này cho một đối tượng được đặt tên, nó không đơn giản như vậy đối với loại ẩn danh. Điều đó nói rằng, không có gì để ngăn chặn bạn [như đề xuất của BFree] bằng cách sử dụng sự phản chiếu để phát ra MSIL cho kiểu ẩn danh - điều này không đơn giản, nhưng cũng không thể.

3

Cách tốt nhất để làm điều đó là sử dụng tuần tự hóa. Nhưng tất nhiên, điều đó không sử dụng cùng một định dạng chuỗi mà bạn mô tả.

Trình khởi tạo đối tượng của bạn không phải chứa các giá trị không đổi.

string myName="bob"; 
int myAge=30; 
double mySalary=100000; 

object empData = new { name = myName, age = myAge, salary = mySalary }; 

Vì vậy, trong trường hợp của bạn, bạn phải phân tích các phần tử riêng lẻ khỏi chuỗi và thực hiện một số chuyển đổi trên chúng để ép buộc chúng thành các loại bạn muốn.

Nếu bạn chưa kết hôn với định dạng chuỗi cụ thể này, bạn có thể tuần tự hóa và deserialize đối tượng của bạn và thực hiện điều tương tự bằng cách sử dụng XML dễ dàng hơn nhiều.

+0

+1 cho suy nghĩ bên ngoài giới hạn của câu hỏi ... nó phải được trễ – BenAlabaster

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