Creación de una instancia por reflection

20/03/2007 - 16:14 por Andoni | Informe spam
Hola a Todos:
Tengo un problema al migrar un código de la versión 1.1 a la 2.0

Tengo una clase:

Public Class Ejemplo
Inherits EjemploBase

#Region "Constructores"
Public Sub New()
MyBase.New()
Initialize()
End Sub

Public Sub New(ByVal pstrName As String)
MyBase.New(pstrName)
Initialize()
End Sub

Protected Sub New(ByVal pobjWareHouse As WareHouseBaseTable)
MyBase.New(pobjWareHouse)
Initialize()
End Sub

Private Sub Initialize()
//Sentencias
End Sub
end class

Ok.
En el MS Framework 1.1 el código que empleaba para generar una instancia es:

Public Shared Function CreateInstance(ByVal pobjObjectType As System.Type)
As Object
Dim arrConstructors() As ConstructorInfo =
pobjObjectType.GetConstructors(BindingFlags.Instance Or
BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Static)
If Not HelperFunctions.IsEmptyArray(arrConstructors) Then
For Each objConstructor As ConstructorInfo In arrConstructors
'Buscar y ejecutar el constructor sin parámetros
Dim arrParameters() As ParameterInfo =
objConstructor.GetParameters
If HelperFunctions.IsEmptyArray(arrParameters) Then
Return objConstructor.Invoke(Nothing)
End If
Next
End If
end if

Ahora con el Framework 2.0 me dispara una excepción del tipo :
{System.MemberAccessException}
pero la clase no es abstracta y los contructores son públicos.
Veo que el otro motivo es :
Que el constructor es un iniciador de la clase ¿?¿?
Me desconcierta un poco ese punto.
Por otro lado al recuperar los constructores me devuelve 4 y en la clase
solo hay 3 ...
¿Alguna idea al respecto?
Gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Toni Recio
21/03/2007 - 11:53 | Informe spam
Un saludo,

He cogido tu clase del ejemplo, quitando las referencias a una clase base, y
variando el tipo de parámetro del segundo constructor, para posteriormente
obtener los constructores mediante el código que muestras, y no me ha dado
ningún problema con .NET 2.0. La información devuelta se corresponde
correctamente con los tres constructores ?¿?¿?¿

:-(

"Andoni" wrote:

Hola a Todos:
Tengo un problema al migrar un código de la versión 1.1 a la 2.0

Tengo una clase:

Public Class Ejemplo
Inherits EjemploBase

#Region "Constructores"
Public Sub New()
MyBase.New()
Initialize()
End Sub

Public Sub New(ByVal pstrName As String)
MyBase.New(pstrName)
Initialize()
End Sub

Protected Sub New(ByVal pobjWareHouse As WareHouseBaseTable)
MyBase.New(pobjWareHouse)
Initialize()
End Sub

Private Sub Initialize()
//Sentencias
End Sub
end class

Ok.
En el MS Framework 1.1 el código que empleaba para generar una instancia es:

Public Shared Function CreateInstance(ByVal pobjObjectType As System.Type)
As Object
Dim arrConstructors() As ConstructorInfo =
pobjObjectType.GetConstructors(BindingFlags.Instance Or
BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Static)
If Not HelperFunctions.IsEmptyArray(arrConstructors) Then
For Each objConstructor As ConstructorInfo In arrConstructors
'Buscar y ejecutar el constructor sin parámetros
Dim arrParameters() As ParameterInfo =
objConstructor.GetParameters
If HelperFunctions.IsEmptyArray(arrParameters) Then
Return objConstructor.Invoke(Nothing)
End If
Next
End If
end if

Ahora con el Framework 2.0 me dispara una excepción del tipo :
{System.MemberAccessException}
pero la clase no es abstracta y los contructores son públicos.
Veo que el otro motivo es :
Que el constructor es un iniciador de la clase ¿?¿?
Me desconcierta un poco ese punto.
Por otro lado al recuperar los constructores me devuelve 4 y en la clase
solo hay 3 ...
¿Alguna idea al respecto?
Gracias de antemano.

Respuesta Responder a este mensaje
#2 Andoni
21/03/2007 - 12:50 | Informe spam
Hola Toni
Lo primero gracias por responder.
Dandole una vuelta más al tema he conseguido que funcione correctamente
especificando:

Dim arrConstructors() As ConstructorInfo =
pobjObjectType.GetConstructors(BindingFlags.Instance Or
BindingFlags.NonPublic Or BindingFlags.Public)

Por una nota que leo en el MSDN no se puede solicitar a la vez los elementos
estáticos y de instancia.(en ese caso devueve ninguno)

Nota: Sobre los 4 constructores me queda la duda de porque ocurria, si tengo
tiempo me haré una maqueta para intentar reproducir el error y les cuento.

Gracias de nuevo

Por otro lado no tenia mucho sentido solicitar los constructores y
especificar el parámetro de búsqueda sobre miembros estáticos.

"Toni Recio" wrote:

Un saludo,

He cogido tu clase del ejemplo, quitando las referencias a una clase base, y
variando el tipo de parámetro del segundo constructor, para posteriormente
obtener los constructores mediante el código que muestras, y no me ha dado
ningún problema con .NET 2.0. La información devuelta se corresponde
correctamente con los tres constructores ?¿?¿?¿

:-(

"Andoni" wrote:

> Hola a Todos:
> Tengo un problema al migrar un código de la versión 1.1 a la 2.0
>
> Tengo una clase:
>
> Public Class Ejemplo
> Inherits EjemploBase
>
> #Region "Constructores"
> Public Sub New()
> MyBase.New()
> Initialize()
> End Sub
>
> Public Sub New(ByVal pstrName As String)
> MyBase.New(pstrName)
> Initialize()
> End Sub
>
> Protected Sub New(ByVal pobjWareHouse As WareHouseBaseTable)
> MyBase.New(pobjWareHouse)
> Initialize()
> End Sub
>
> Private Sub Initialize()
> //Sentencias
> End Sub
> end class
>
> Ok.
> En el MS Framework 1.1 el código que empleaba para generar una instancia es:
>
> Public Shared Function CreateInstance(ByVal pobjObjectType As System.Type)
> As Object
> Dim arrConstructors() As ConstructorInfo =
> pobjObjectType.GetConstructors(BindingFlags.Instance Or
> BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Static)
> If Not HelperFunctions.IsEmptyArray(arrConstructors) Then
> For Each objConstructor As ConstructorInfo In arrConstructors
> 'Buscar y ejecutar el constructor sin parámetros
> Dim arrParameters() As ParameterInfo =
> objConstructor.GetParameters
> If HelperFunctions.IsEmptyArray(arrParameters) Then
> Return objConstructor.Invoke(Nothing)
> End If
> Next
> End If
> end if
>
> Ahora con el Framework 2.0 me dispara una excepción del tipo :
> {System.MemberAccessException}
> pero la clase no es abstracta y los contructores son públicos.
> Veo que el otro motivo es :
> Que el constructor es un iniciador de la clase ¿?¿?
> Me desconcierta un poco ese punto.
> Por otro lado al recuperar los constructores me devuelve 4 y en la clase
> solo hay 3 ...
> ¿Alguna idea al respecto?
> Gracias de antemano.
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida