variable - VB.NET Obtener system.type subyacente de tipo nullable
variable null vb net (5)
Supongo que el problema es reconocer si la propiedad es nula o no. En C # haces esto con este código:
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
... pero no estoy seguro de cuál es el equivalente de esa última cláusula en VB.NET.
Estoy intentando crear un conjunto de datos basado en las propiedades de un objeto. Por ejemplo, tengo una instancia de una clase Persona con propiedades que incluyen ID, Nombre, Apellidos, Fecha de nacimiento, etc. Usando la reflexión, agrego columnas a un nuevo conjunto de datos basado en las propiedades del objeto:
For Each pi As PropertyInfo In person.GetType().GetProperties()
Dim column As New DataColumn(pi.Name, pi.PropertyType)
table.Columns.Add(column)
Next
Mi problema es que algunas de esas propiedades son tipos anulables que no son compatibles con datasets. ¿Hay alguna forma de extraer el tipo de sistema subyacente de un tipo que admite nulos?
Gracias.
@Mendelt Siebenga: solo puede llamar a GetType en la propiedad de valor si la variable no está establecida en nulo; de lo contrario, obtendrás una excepción.
Lo que quiere hacer es usar la propiedad "GetValueOrDefault" y llamar a GetType sobre eso, ya que está garantizado que no será nulo. Ejemplo:
Dim i As Nullable(Of Integer) = Nothing
Dim t As Type = i.GetValueOrDefault().GetType()
Aquí está su respuesta, en VB. Esto puede ser excesivo para sus propósitos, pero también puede ser útil para otras personas.
En primer lugar, aquí está el código para averiguar si se trata de un tipo anulable:
Private Function IsNullableType(ByVal myType As Type) As Boolean
Return (myType.IsGenericType) AndAlso (myType.GetGenericTypeDefinition() Is GetType(Nullable(Of )))
End Function
Tenga en cuenta la sintaxis inusual en GetType. Es necesario. Simplemente haciendo GetType (Nullable) como uno de los comentarios sugeridos no funcionó para mí.
Entonces, armado con eso, puede hacer algo como esto ... Aquí, en una herramienta ORM, estoy tratando de obtener valores en un tipo genérico que puede o no ser 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
Tenga en cuenta que verifico Nothing en la primera línea porque Convert.ChangeType se ahogará en él ... Puede que no tenga ese problema, pero mi situación es extremadamente abierta.
Afortunadamente, si no respondí tu pregunta directamente, puedes canibalizarla y llevarte a donde necesitas ir, pero acabo de implementar esto momentos antes, y mis pruebas están todas aprobadas.
Nullable.GetUnderylingType(myType)
devolverá el tipo subyacente o nulo si no es un tipo que admite nulos.
También puede usar el método GetGenericParameters()
en ese tipo. myNullableObject.GetType().GetGenericParameters()[0]
debería darle el tipo de nulo que es (por lo tanto, Guid
, Int32
, etc.)