2011-05-08 18 views
6

Mi aplicación utiliza la reflexión para analizar el código C++/cli en tiempo de ejecución.
necesito para determinar si un tipo tiene un constructor sin parámetros no administrados (punteros y tal), porque quiero más adelante a utilizar:¿Cómo puedo determinar si un objeto ConstructorInfo tiene un parámetro no administrado?

ConstructorInfo constructorInfo; 
// ... 
var ret = constructorInfo.Invoke(BindingFlags..., null, myParameters, null); 

si el constructor tiene un puntero a un objeto no administrado como un parámetro, hay una excepción de lanzamiento cuando le paso nulo.

Entonces, ¿cómo puedo determinar eso? no hay IsManaged ... e IsPointer no ayuda en este caso.

+0

¿Por qué no funciona 'IsPointer'? – Gabe

+0

Porque muchos otros objetos gestionados devolverán True para IsPointer (es decir, matrices) ... – seldary

+0

Un puntero * * a una matriz devolverá True para 'IsPointer'. Además, una matriz C++ se representa como un puntero, por lo que un puntero a un objeto y una matriz de objetos son esencialmente idénticos. Ninguno de ellos se considera tipos de matrices reales en .NET. – Gabe

Respuesta

2

No está claro cuál es tu problema en realidad es, pero aquí es un programa de demostración corta que muestra que pasa null a un constructor que toma un puntero como un argumento y lo detecta con IsPointer:

using System; 
using System.Reflection; 

namespace pointers 
{ 
    unsafe class Program 
    { 
     public Program(int* x) 
     { 
      Console.WriteLine("It worked!"); 
     } 

     static void Main(string[] args) 
     { 
      ConstructorInfo[] c = typeof(Program).GetConstructors(); 
      c[0].Invoke(BindingFlags.Default, null, new object[] { null }, null); 
      Console.WriteLine(c[0].GetParameters()[0].ParameterType.IsPointer); 
     } 
    } 
} 

Imprime:

 
It worked! 
True

+0

Ver el comentario de la pregunta ... IsPointer no devuelve True, pero para otros tipos administrados, necesito una prueba que devuelva verdadero para AND no administrado Y falso para cualquier otro tipo. ¡Gracias! – seldary

+0

@seldary: si crees que hay un tipo no puntero cuyo 'IsPointer' devuelve True, por favor dime de qué se trata. Pero aún no tengo claro por qué no se puede pasar 'null' por un puntero real. – Gabe

+0

mi mal, ¡IsPointer realmente hace el trabajo! Gracias... – seldary

-1

Pruebe si el parámetro es un tipo de valor. null no es un valor válido para ningún tipo de valor, ya sea un puntero no administrado o simplemente int.

+0

¿Los punteros no administrados son tipos de valor? – Gabe

+0

En particular, puede decir 'int * x = null;' por lo que cualquier puntero puede ser nulo. – Gabe

+0

@Gabe: Todos los punteros son tipos de valores. Y el valor nulo para un puntero es diferente de una referencia de objeto 'nulo', que es lo que suena como @seldary está pasando. O al menos eso es lo que entiendo de lo que dice la pregunta ... –

Cuestiones relacionadas