2008-10-30 32 views
14

Tôi muốn có thể truyền một giá trị động ở nơi loại được biết chỉ khi chạy. Một cái gì đó như thế này:Đúc trong VB.NET

myvalue = CType(value, "String, Integer or Boolean") 

Chuỗi chứa giá trị kiểu được chuyển làm đối số và cũng được đọc từ cơ sở dữ liệu và giá trị được lưu trữ dưới dạng chuỗi trong cơ sở dữ liệu.

Điều này có khả thi không?

Trả lời

7

Chắc chắn, nhưng myvalue sẽ phải được xác định là loại Object và bạn không nhất thiết muốn điều đó. Có lẽ đây là một trường hợp tốt hơn được phục vụ bởi Generics.

Điều gì xác định loại nào sẽ được sử dụng?

+0

chỉ là một chuỗi cho biết loại "Chuỗi", "số nguyên", "boolean" – Youssef

+0

Sau đó, những gì đặt chuỗi? –

+0

chuỗi được chuyển làm đối số – Youssef

4

Làm cách nào để xác định loại nào là bắt buộc? Như Joel đã nói, đây có lẽ là một trường hợp cho Generics. Vấn đề là: vì bạn không biết loại tại thời gian biên dịch, bạn không thể xử lý giá trị được trả về, vì vậy việc truyền không thực sự có ý nghĩa ở đây.

2

Có thể thay vì tự động truyền nội dung nào đó (có vẻ như không hoạt động), bạn có thể sử dụng phản chiếu thay thế. Thật dễ dàng để có được và gọi các phương thức hoặc thuộc tính cụ thể.

Dim t As Type = testObject.GetType() 
Dim prop As PropertyInfo = t.GetProperty("propertyName") 
Dim gmi As MethodInfo = prop.GetGetMethod() 
gmi.Invoke(testObject, Nothing) 

Nó không phải là đẹp, nhưng bạn có thể làm một số trong đó trong một dòng thay vì rất nhiều.

5

Đây là cách ngắn nhất để thực hiện. Tôi đã thử nghiệm nó với nhiều loại.

Sub DoCast(ByVal something As Object) 

    Dim newSomething = Convert.ChangeType(something, something.GetType()) 

End Sub 
9
Dim bMyValue As Boolean 
Dim iMyValue As Integer 
Dim sMyValue As String 
Dim t As Type = myValue.GetType 


Select Case t.Name 
    Case "String" 
     sMyValue = ctype(myValue, string) 
    Case "Boolean" 
     bMyValue = ctype(myValue, boolean) 
    Case "Integer" 
     iMyValue = ctype(myValue, Integer) 
End Select 

Đó là một chút hacky nhưng nó hoạt động.