2011-01-04 9 views
5

Tengo un método de C# decir:¿Cómo identificar cada tipo de parámetro en un método de C#?

MyMethod(int num, string name, Color color, MyComplexType complex) 

El uso de la reflexión, ¿cómo puedo claramente identificar cada uno de los tipos de parámetros de cualquier método? Quiero realizar algunas tareas por tipo de parámetro. Si el tipo es simple int, string o boolean entonces hago algo, si es Color, XMLDocument, etc. Hago otra cosa y si es de tipo definido por el usuario como MyComplexType o MyCalci, etc., entonces quiero hacer cierta tarea.

Soy capaz de recuperar todos los parámetros de un método usando ParameterInfo y puedo recorrer cada parámetro y obtener sus tipos. Pero, ¿cómo puedo identificar cada tipo de datos?

foreach (var parameter in parameters) 
{ 
    //identify primitive types?? 
    //identify value types 
    //identify reference types 

} 

Editar: esto es parte de mi código para crear una especie de rejilla propert página donde quiero mostrar la lista de parámetros con tipos de datos para el método seleccionado. Si el parámetro tiene un tipo de referencia/tipo definido por el usuario, entonces quiero expandirlo más para mostrar todos los elementos debajo de él con los tipos de datos.

+0

¿Qué es exactamente lo que quieres hacer con el parámetro de tipo complejo? –

+0

Tienes un problema * mucho * más grande que eso, ¿cómo vas a generar el * valor * adecuado para hacer la llamada? Piense en esto y la respuesta saldrá a la luz. Mire la palabra clave * dynamic *. –

+0

@mace, básicamente, estoy tratando de crear un tipo de página de propiedades, donde la página debe mostrar los parámetros y el tipo. Si es un tipo de referencia como MyComplexType, entonces estoy expandiendo ese tipo para encontrar otro tipo dentro de él.Si no es un tipo de referencia como int, cadena o color, entonces no necesito verificarlo. Espero que entiendas lo que quiero decir. –

Respuesta

10

Hacer uso de ParameterInfo.ParameterType

using System; 
using System.Reflection; 

class parminfo 
{ 
    public static void mymethod (
     int int1m, out string str2m, ref string str3m) 
    { 
     str2m = "in mymethod"; 
    } 

    public static int Main(string[] args) 
    { 
     Console.WriteLine("\nReflection.Parameterinfo"); 

     //Get the ParameterInfo parameter of a function. 

     //Get the type. 
     Type Mytype = Type.GetType("parminfo"); 

     //Get and display the method. 
     MethodBase Mymethodbase = Mytype.GetMethod("mymethod"); 
     Console.Write("\nMymethodbase = " + Mymethodbase); 

     //Get the ParameterInfo array. 
     ParameterInfo[]Myarray = Mymethodbase.GetParameters(); 

     //Get and display the ParameterInfo of each parameter. 
     foreach (ParameterInfo Myparam in Myarray) 
     { 
      Console.Write ("\nFor parameter # " + Myparam.Position 
      + ", the ParameterType is - " + Myparam.ParameterType); 
     } 
     return 0; 
    } 
} 

Si es necesario comprobar la System.Type una vez recuperada puede utilizar IsPrimitive y IsByRef como se ha mencionado por David. Además, también puede usar IsValueType. Hay un número significativo de propiedades Is * dentro de la clase System.Type. Su mejor opción sería la de comprobar la documentación de MSDN en cada Es decir, la propiedad * ... IsClass Unidos ...

Obtiene un valor que indica si el tipo es una clase; es decir, no es un tipo de valor o interfaz.

Por lo tanto, se puede deducir que IsValueType no necesita ser llamado. Tenga en cuenta que un tipo determinado puede devolver verdadero en múltiples propiedades en el que IsClass podría devolver verdadero Y IsPassByRef podría devolver verdadero. Tal vez proporcione lógica para los tipos de CLR conocidos, ya que estos no cambiarán y usted los conocerá con anticipación y luego construirá la lógica para los tipos complejos tal como los define el usuario. Podría tomar el enfoque de construir en la lógica para hacer esto también para los tipos CLR; De cualquier manera funcionaría.

+0

Pude obtener el tipo del parámetro. ¿Ahora cómo identificaré cada tipo ... si es un tipo de referencia o un tipo de valor o un tipo primitivo? Quiero un código genérico para hacerlo por cualquier método que se le pase. –

+0

ParameterType devuelve un System.Type, que tiene una propiedad llamada IsByRef (le dice si es un tipo de referencia) y otra llamada IsPrimitive. –

+0

@ user465876 Comentario adicional adicional mencionado por David, además de una referencia a IsValueType –

2

Para obtener el Type real del parámetro use ParameterType en el valor ParameterInfo. Con ese valor, hay varias formas de usarlo para identificar el tipo. Lo más fácil es con una comparación directa con un tipo conocido

if (parameter.ParameterType == typeof(int)) { 
    ... 
} 

O en caso de que el tipo no se dispone de un partido de nombre se puede utilizar (aunque esto es un poco más hojaldrada como operaciones Refactor pueden perderse la cadena constante y en silencio romper la aplicación)

if (parameter.ParameterType.Name == "TheTypeName") { 
    ... 
} 
+0

De esta manera me restringiré a hacer que el código sea genérico para cualquier método ... o tengo que verificar todos y cada uno de los tipos que existen en C#. Me gustaría tener una forma genérica de verificar el tipo de parámetro sobre la marcha. –

+0

@ user465876 si lo primordial es lo único que le interesa, simplemente utilice la propiedad 'IsPrimitive'. – JaredPar

+0

Creo que podría explicarlo correctamente. En realidad, quiero escribir un código genérico que lea un nombre de método y obtenga todos los parámetros y luego los escriba en una página con su tipo. Si el tipo es tipo de referencia (definido por el usuario), debe expandirlo aún más para verificar los tipos dentro de él y escribirlo en la página. Algo así como una grilla de propiedad. Me importa cada tipo para que sepa cuál es el que más. –

Cuestiones relacionadas