2009-09-23 45 views
7

Tôi có tài liệu XML nàyLàm thế nào để tự động đúc một đối tượng kiểu chuỗi để một đối tượng kiểu T

<AdditionalParameters> 
<PublishToPdf Type ="System.Boolean">False</PublishToPdf> 
</AdditionalParameters> 

trong mã của tôi và tôi đang cố gắng để xây dựng một mảng các đối số có chứa các nút <PublishToPdf>.

object test = (object) ((typeof(publishNode.Attributes["Type"].value)) publishNode.InnerText); 

Điều này xảy ra tại thời gian biên dịch. Tôi không thể tìm ra cách để đúc publishNode.InnerText('false') đến một đối tượng được xác định thời gian chạy được xác định trong tệp XML và lưu trữ nó trong một đối tượng (mà sẽ bảo tồn loại).

Trả lời

19

Bạn có thể sử dụng Convert.ChangeType:

object value = Convert.ChangeType(stringValue, destinationType); 
+0

Cảm ơn rất nhiều, nó hoạt động tốt. – LolaRun

+0

Có, và để có được DestinationType, sử dụng var destinationType = Type.Parse (publicationNode.Attributes ["Type"]. Value); – Digitalex

+0

Type.Parse() dường như không tồn tại. Ý của bạn có phải là Type.GetType() không? –

2

Bạn không thể làm chính xác những gì bạn đang cố gắng làm. Đầu tiên, từ khóa typeof không cho phép đánh giá động khi chạy. Có phương tiện để làm điều này bằng cách sử dụng sự phản chiếu, với các phương thức như Type.GetType(string), nhưng các đối tượng Type được trả về từ các hàm phản chiếu này không thể được sử dụng cho các hoạt động như truyền.

Những gì bạn cần làm là cung cấp phương tiện chuyển đổi loại của bạn đến và từ biểu diễn chuỗi. Không có chuyển đổi tự động từ bất kỳ loại tùy ý nào. Ví dụ của bạn, bạn có thể sử dụng bool.Parse hoặc bool.TryParse, nhưng chúng cụ thể cho loại bool. Có những phương pháp tương tự trên hầu hết các loại nguyên thủy.

+0

Thực hiện chuỗi đã thực hiện thủ thuật cho tôi. – Slion

1

Giải pháp đơn giản, giả sử có một số hạn chế về loại tốt;

object GetValueObject(string type, string value) 
{ 
    switch (type) 
    { 
    case "System.Boolean": 
     return Boolean.Parse(value); 
    case "System.Int32": 
     return Int32.Parse(value); 
    ... 
    default: 
     return value; 
    } 
} 

var type = publishNode.Attributes["Type"].value; 
var value = publishNode.InnerText; 
var valueObject = GetValueObject(type, value); 
+0

Tôi đang làm việc với .net framework 2.0. và tôi không có var. Và giải pháp bạn đề xuất là nhà máy thực hiện việc tạo ra các loại objets của tất cả các loại, vô số. Nhưng cảm ơn sự giúp đỡ của bạn. – LolaRun

+0

Vâng, var là chỉ để làm cho mã ngắn hơn, u có thể sử dụng chuỗi, chuỗi, đối tượng cho ba thay thế. Và, như tôi đã nói, nếu bạn chỉ cần hỗ trợ một số loại giới hạn, điều này sẽ hoạt động tốt. Nếu không, thì bạn nói đúng là không thực tế. – Digitalex

+1

Với C# 6, bạn có thể sử dụng 'case nameof (System.Guid):' ví dụ. Không cần chuỗi const nữa. nameof là thời gian biên dịch được tạo. –

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