visual variable property not net empty diferente vb.net reflection dataset

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.)