2011-01-26 12 views
14

tengo este código:Declarar una variable usando un tipo de variable

Type leftType = workItem[LeftFieldName].GetType(); 

entonces quiero declarar una variable de ese tipo:

leftType someVar; 

¿Es posible?

+2

No, no es así. Piense con cuidado al respecto, y se dará cuenta de que una variable así sería completamente inútil. – SLaks

+0

¿Qué estás tratando de lograr? Posiblemente haya otra manera de resolver su problema real. – Trinidad

Respuesta

20

Puede hacer algo como esto y convertirlo a una interfaz conocida.

var someVar = Convert.ChangeType(someOriginalValue, workItem[LeftFieldName].GetType()); 
var someVar = Activator.CreateInstance(workItem[LeftFieldName].GetType()); 

Si reemplaza var con dynamic (y que está utilizando .Net 4), puede llamar a los métodos que se espera en el objeto somevar. Si no existen, obtendrá una MissingMethodException.

+0

Gracias! Justo lo que necesitaba. –

+0

Parece un poco trabajo. ¿Es la mejor manera de hacer las cosas? No hay otra (mejor) forma de crear variables de tipos dinámicos? –

+1

@MoheTheDreamy A pesar de que esta es la forma ** más fácil ** para crear variables es: 'var someVar = workItem [LeftFieldName]', sin embargo ** no es seguro **, porque accidentalmente puede ** alterar ** (en caso de un * tipo de referencia *) ** valor ** del objeto original. Te recomiendo que sigas con la estrategia descrita en la respuesta de [Austin] (https://stackoverflow.com/questions/4800446/declare-a-variable-using-a-type-variable/4800501#4800501) ('var someVar = Activator.CreateInstance (workItem [LeftFieldName] .GetType());') –

1

No puede hacer eso.

Se podría utilizar el tipo de dynamic para .Net 4, pero para las versiones anteriores .Net, el único tipo que se ajuste es object, que tendrá que echar mano de nuevo más tarde por las pruebas .GetType() en lo que asignó a la object variable de tipo

lectura: SO link: whats-the-difference-between-dynamicc-4-and-var

+4

No estoy seguro de cómo esto se aplica. El uso de 'var' no importa aquí. – Joe

+0

Puede notar que cambié 'var someVar;' a 'var someVar =' que lo asigna y luego implícitamente escribe 'someVar'. Esto permite escribir 'someVar' específicamente, que es lo que el OP estaba buscando. Como no tener que descubrir un tipo de columna db. – RichardTheKiwi

+2

¡espero que sepas que * var * SIEMPRE se resolverá a un tipo específico en tiempo de compilación! –

8

Esto no es posible.

Los tipos de variables son un concepto en tiempo de compilación; no tendría sentido declarar una variable de un tipo que no se conoce hasta el tiempo de ejecución.
No podría hacer nada con la variable, ya que no sabría de qué tipo es.

Probablemente esté buscando la palabra clave dynamic.

+0

Un posible caso de uso: en mi proyecto MVC tengo un objeto 'Form' y agrego los campos que quiero editar usando algo como' new EditField (e => e.AddressId) '.Uso el 'MemberExpression' para crear el elemento de formulario correcto, pero algunos tipos necesitan un valor predeterminado. EG 'long' tiene el valor predeterminado 0 y' DateTime' tiene una fecha predeterminada. En lugar de crear una gran cantidad de instrucciones If para establecer el valor predeterminado adecuado para cada tipo, simplemente creo una instancia como Austin explicó y uso '.ToString()' para obtener el valor predeterminado correcto. –

1

No, eso no es posible. El tipo de una variable debe conocerse en tiempo de compilación.

Puede declarar una variable de tipo object, podrá almacenar cualquier tipo de datos.

2

GetType se evalúa en tiempo de ejecución, y la no declaración dynamic es en tiempo de compilación (que se hace algo más específico que eso, sí), por lo que no. Incluso var requerirá que le asigne un valor de tipo inequívoco.

3

objeto x = Activator.CreateInstance (Type) le permitirá crear el objeto. Si puede hacer mucho más allá de ese punto, no estoy seguro.

+1

Eso creará una instancia de ese tipo, no una variable de ese tipo. – Guffa

Cuestiones relacionadas