2008-08-31 39 views
10

Tôi đang cố gắng tạo tập dữ liệu dựa trên các thuộc tính của một đối tượng. Ví dụ, tôi có một thể hiện của một lớp người với tài sản bao gồm ID, tên đầu tiên, Họ, DOB vv Sử dụng phản chiếu, tôi thêm cột để một tập dữ liệu mới dựa trên các thuộc tính đối tượng:VB.NET Lấy hệ thống cơ bản.type từ kiểu vô hiệu

For Each pi As PropertyInfo In person.GetType().GetProperties() 
    Dim column As New DataColumn(pi.Name, pi.PropertyType) 
    table.Columns.Add(column) 
Next 

Vấn đề của tôi là một số trong những tính hợp lệ đó là các loại nullable không được các bộ dữ liệu hỗ trợ. Có cách nào để trích xuất các loại hệ thống cơ bản từ một loại nullable?

Cảm ơn.

Trả lời

1

Tôi đoán rằng sự cố đang nhận biết liệu thuộc tính có thể vô hiệu hóa hay không. Trong C# bạn làm điều này với mã này:

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 

... nhưng tôi không chắc tương đương với điều khoản cuối cùng trong VB.NET là gì.

+0

if (type.IsGenericType AndAlso type.GetGenericTypeDefinition là GetType (Nullable)) –

+0

Đó thực sự không phải là bản dịch chính xác cho VB, kỳ lạ là đủ. Kiểm tra câu trả lời của tôi. –

+0

Có, 'Nullable' và' Nullable <> 'là hai loại khác nhau. –

0

@Mendelt Siebenga: Bạn chỉ có thể gọi GetType trên thuộc tính giá trị nếu biến không được đặt thành rỗng; nếu không, bạn sẽ nhận được một ngoại lệ.

Những gì bạn muốn làm là sử dụng thuộc tính "GetValueOrDefault" và gọi GetType trên đó, vì bạn được đảm bảo nó sẽ không rỗng. Ví dụ:

Dim i As Nullable(Of Integer) = Nothing 
Dim t As Type = i.GetValueOrDefault().GetType() 
2

Bạn cũng có thể sử dụng phương pháp GetGenericParameters() trên loại đó. myNullableObject.GetType().GetGenericParameters()[0] sẽ cung cấp cho bạn loại vô giá trị là (vì vậy Guid, Int32, v.v.)

15

Đây là câu trả lời của bạn, trong VB. Điều này có thể là quá mức cần thiết cho mục đích của bạn, nhưng nó cũng có thể hữu ích cho một số người khác.

Trước hết, đây là đoạn code để tìm hiểu xem bạn đang làm việc với một loại Nullable:

Private Function IsNullableType(ByVal myType As Type) As Boolean 
    Return (myType.IsGenericType) AndAlso (myType.GetGenericTypeDefinition() Is GetType(Nullable(Of))) 
End Function 

Lưu ý cú pháp không bình thường trong GetType. No cân thiêt. Chỉ cần làm GetType (Nullable) là một trong những bình luận được đề xuất đã không làm việc cho tôi.

Vì vậy, trang bị đó, bạn có thể làm một cái gì đó như thế này ... Ở đây, trong một công cụ ORM, tôi đang cố gắng để có được giá trị vào một kiểu generic có thể có hoặc không có Nullable:

If (Not value Is Nothing) AndAlso IsNullableType(GetType(T)) Then 
    Dim UnderlyingType As Type = Nullable.GetUnderlyingType(GetType(T)) 
    Me.InnerValue = Convert.ChangeType(value, UnderlyingType) 
Else 
    Me.InnerValue = value 
End If 

Lưu ý rằng tôi kiểm tra Không có gì trong dòng đầu tiên bởi vì Convert.ChangeType sẽ choke trên nó ... Bạn có thể không có vấn đề đó, nhưng tình hình của tôi là cực kỳ mở kết thúc. Hy vọng rằng nếu tôi không trả lời trực tiếp câu hỏi của bạn, bạn có thể cannibalize điều này và đưa bạn đến nơi bạn cần đến - nhưng tôi đã thực hiện những khoảnh khắc này trước đây, và các bài kiểm tra của tôi đều được chuyển qua.

+0

Tất cả những gì anh ta yêu cầu là kiểu cơ bản nên tất cả những gì bạn cần là Nullable.GetUnderlyingType. –

+0

Tôi nghi ngờ anh ta sẽ cần đến hầu hết nó.:) –

+0

Tuyệt vời đăng bài, lưu ass của tôi! – tbone

4
Nullable.GetUnderylingType(myType) 

sẽ trả về kiểu cơ bản hoặc null nếu nó không phải là loại không có giá trị.

+0

Tuyệt vời, cảm ơn! trong C# tôi đã không thể có được '... là typeof (Nullable <>)' để biên dịch (tôi sẽ tìm ra lý do tại sao sau này), do đó, điều này hoàn toàn lưu trán của tôi từ đầu/bàn tương tác lặp đi lặp lại. Đơn giản hơn các giải pháp khác. – Groxx

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