2011-01-15 17 views
6

En C#, necesito poder crear una matriz de objetos Type en tiempo de ejecución en función de una lista delimitada por comas de tipos de datos pasados ​​a una función como una cadena. Básicamente, esto es lo que estoy tratando de lograr:Cree dinámicamente una matriz de Tipo en C#

// create array of types 
Type[] paramTypes = { typeof(uint), typeof(string), typeof(string), typeof(uint) }; 

Pero tengo que ser capaz de llamar a mi función como esta:

MyFunction("uint, string, string, uint"); 

y haga que sea generar la matriz dinámica en función de la cadena pasada in. Aquí estaba mi primer intento:

void MyFunction(string dataTypes) 
{ 
    //out or in parameters of your function. 
    char[] charSeparators = new char[] {',', ' '}; 
    string[] types = dataTypes.Split(charSeparators, 
         stringSplitOptions.RemoveEmptyEntries); 

    // create a list of data types for each argument 
    List<Type> listTypes = new List<Type>(); 
    foreach (string t in types) 
    { 
     listTypes.Add(Type.GetType(t)); 
    } 
    // convert the list to an array 
    Type [] paramTypes = listTypes.ToArray<Type>(); 

} 

Este código simplemente crea una matriz de objetos nulos de tipo System.Type. Estoy bastante seguro de que el problema está aquí:

listTypes.Add(Type.GetType(t)); 

Sugerencias sobre por qué esta sintaxis no funciona?

+1

Puede encontrar esta tabla de alias C# útil para una instrucción 'switch' o similar. http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx – Ani

+0

Además del issuename-issue, considere utilizar la versión sobrecargada de 'Type.GetType' que ignora el caso. –

Respuesta

4

El problema es que no hay uint y string tipos de .NET. Esos son alias de tipo C# para los tipos de System.UInt32 y System.String. Por lo que debe llamar a su función como esta:

MyFunction("System.UInt32, System.String, System.String, System.UInt32"); 
5

Pase en System.String, System.Int32 en lugar de string y int.

"cadena" es solo una abreviatura de System.String. Type.GetType no aceptará notación abreviada para tipos.

+0

Gracias! Eso hizo el truco! – acordner

3

Utilice el nombre completo para cada tipo, incluido el espacio de nombres. De este modo:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dataTypes = "System.UInt32, System.String, System.String, System.UInt32"; 

     //out or in parameters of your function. 
     char[] charSeparators = new char[] { ',', ' ' }; 
     string[] types = dataTypes.Split(charSeparators, 
          StringSplitOptions.RemoveEmptyEntries); 

     // create a list of data types for each argument 
     List<Type> listTypes = new List<Type>(); 
     foreach (string t in types) 
     { 
      listTypes.Add(Type.GetType(t)); 
     } 
     // convert the list to an array 
     Type[] paramTypes = listTypes.ToArray<Type>(); 
    } 
} 
1

no funciona porque uint, string, etc, no son los nombres oficiales de los tipos de .NET. Son alias de C# para System.UInt32, System.String, etc. Deberá usar los nombres de tipo .net si desea crear tipos dinámicamente así.

Cuestiones relacionadas