2009-12-01 48 views
9

Đánh giá theo tiêu đề của câu hỏi này, những gì tôi muốn làm có thể không thể, vì vậy tôi sẽ mô tả những gì tôi đang làm và bạn có thể cảm thấy tự do để cho tôi biết những gì tôi ' m làm sai và những gì sẽ là một cách tốt hơn để hoàn thành mục tiêu của tôi.C# Loại đúc tại thời gian chạy Sử dụng Reflection

Tôi có tệp XML mô tả 1) đối tượng tùy chỉnh được bắt nguồn từ loại cơ sở và 2) tên trường nội bộ và giá trị được liên kết. Các đối tượng có nguồn gốc này có thể có các trường bổ sung mà lớp cơ sở không biết.

Tôi trích xuất loại đối tượng dưới dạng chuỗi và tôi đặt tất cả dữ liệu đối tượng vào từ điển trong đó khóa là tên trường và giá trị là giá trị của trường. Tôi khởi tạo đối tượng bằng cách sử dụng tên chuỗi và hàm tạo mặc định của đối tượng. Tôi có thể ngửi tất cả các thuộc tính của đối tượng thành PropertyInfo []. Bây giờ tôi cần phải lấy tất cả các giá trị có dạng chuỗi và chuyển đổi chúng thành các kiểu dữ liệu chính xác để tôi có thể tải chúng vào các thuộc tính của đối tượng. (Khi tôi gõ cái này, có vẻ như tôi đang lấy một trạng thái tiết kiệm và khôi phục lại nó, nhưng tôi chỉ nghe về thứ này. Nếu bạn muốn tư vấn cho những dòng này, thì hãy nhớ rằng Tôi bị kẹt dữ liệu đọc từ một tệp XML và tôi không thể thay đổi dữ liệu đó.)

Tôi có thể chuyển đổi tất cả các giá trị chuỗi thành loại được cung cấp bởi đối tượng Loại và sử dụng hàm brute-force mà tôi đã tạo có định nghĩa sau:

public object convertMe(string v, Type t) 

Vì tôi không biết những gì Loại tôi ném vào chức năng, tôi không biết điều gì sắp trở lại và tôi không thể bỏ dứt khoát đối tượng đến loại thích hợp để gán cho thuộc tính nói trên. Tôi đã được cố gắng loại sau đây của phôi vô ích:

string objectType = /*read type string from XML*/; 

... // Wherein I instantiate an object "theObject" and get PropertyInfo[] from it. 
... // I also make sure that I'm trying to assign the correct data to 
... // the correct property. 

Type t = currentProperty.PropertyType; 
object o = convertMe(value, Type.GetType(qtype)); 
currentProperty.SetValue(theObject, (t)o, null); // Doesn't work 
currentProperty.SetValue(theObject, (t)Convert.ChangeType(o, t), null); // Doesn't work. Apparently (t) is bad syntax. 

Cuối cùng, mục tiêu của tôi là tạo ra một thể hiện của đối tượng và tải nó với dữ liệu từ file XML trong một cách mà các kiểu dữ liệu aren không được mã hóa cứng. Lý do tôi làm điều này trong C# là vì đây từng là một chương trình Python và tôi đã được gán để dịch nó thành C# .NET 2.0. Đó là một kinh nghiệm học tập để nói rằng ít nhất. Lý do mà tôi tạo ra rằng "chức năng bạo lực" là bởi vì tôi đang tìm kiếm một cách xung quanh vấn đề này đúc, nhưng không có vấn đề gì tôi cố gắng tôi không thể làm cho nó hoạt động. Tôi có thể tự mình làm điều này bằng cách sử dụng lực lượng tinh khiết, nhưng tôi nghĩ rằng phải có một giải pháp thanh lịch mà tôi đang thiếu.

Bất kỳ trợ giúp nào được đánh giá cao!

Trả lời

14

Bạn không cần bất kỳ dàn diễn viên nào. PropertyInfo.SetValue lấy một đối số thuộc loại object, vì vậy, chỉ cần vượt qua o cho nó và điều đó sẽ xảy ra.

+0

Cũng làm tôi sợ. Tôi sẽ bôi lên điều này với sự mù mã.Mặc dù các tài liệu MSDN nói rằng nó mất một đối tượng, mỗi ví dụ cho thấy việc sử dụng nó sử dụng loại giá trị thích hợp, vì vậy tôi không bao giờ thực hiện kết nối đó. Cảm ơn nhiều! – Sanjamal

5

Bạn không cần dàn diễn viên nào cả. Tính năng Truyền chỉ hữu ích khi bạn đang cố xử lý trực tiếp các đối tượng, chứ không phải khi bạn đang sử dụng sự phản chiếu.

Khi bạn đặt thuộc tính, bạn đang sử dụng PropertyInfo.SetValue. Việc này lấy một tham số giá trị object, vì vậy không cần phải cố gắng ép buộc điều này vào loại cụ thể (miễn là đối tượng đã là loại chính xác).

Vì bạn đã thực hiện một "convertMe" để đặt đối tượng vào đúng loại (được đúc hoặc đóng hộp thành Object), bạn đã sẵn sàng - chỉ cần sử dụng nó.

+0

Cảm ơn bạn rất nhiều! – Sanjamal

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