2009-02-17 20 views
27

¿Es posible convertir un objeto al tipo devuelto desde GetType()? Me gustaría un método genérico que pueda aceptar un objeto (para tipos anónimos) pero luego devolver un molde de objeto como el tipo anónimo. He estado pensando en usar LCG DynamicMethod para construir un método en una clase de contenedor, pero no puedo entender exactamente cómo se vería. La idea de lanzar con el método GetType() fue poder obtener el tipo anónimo y convertir un objeto a su tipo real sin saber realmente el tipo.Emitir con GetType()

El objetivo primordial es pegar objetos anónimos en un contenedor, que luego podría compartir y pasar entre los métodos.

+0

Tengo curiosidad acerca de su caso de uso aquí, ya que no es necesario que el tipo de variable también sea correcto, y no es posible escribir de forma dinámica. – Ray

+0

Supongo que un método genérico? –

+0

Este es bastante viejo. Originalmente estaba buscando implementar un lenguaje Tutorial D en C# utilizando tipos anónimos como mecanismo de almacenamiento. Resultó ser una mala idea. La dinámica podría cambiar eso, pero desde entonces he renunciado al proyecto ... por ahora. –

Respuesta

13

Su intención es muy poco clara; sin embargo, una opción es genéricos y MakeGenericMethod en particular. ¿Qué quieres hacer con esto? Por ejemplo:

static class Program 
{ 
    static void Main() 
    { 
     object obj = 123.45; 
     typeof(Program).GetMethod("DoSomething") 
      .MakeGenericMethod(obj.GetType()) 
      .Invoke(null, new object[] { obj }); 
    } 
    public static void DoSomething<T>(T value) 
    { 
     T item = value; // well... now what? 
    }  
} 

Así que ahora tenemos el valor, a máquina como a través de los genéricos double - pero todavía no hay mucho que podemos hacer con ella, excepto para llamar otros métodos genéricos ... ¿qué fue lo que quiero hacer aqui?

35

No puedo pensar en por qué querrías lanzar como GetType(), porque no podrías hacer nada útil con el resultado, sin saber el tipo en tiempo de compilación de todos modos.

Quizás lo que estás buscando, es poder convertir. Si ese es el caso, lo siguiente debe funcionar para usted:

object input = GetSomeInput(); 
object result = Convert.ChangeType(input, someOtherObject.GetType()); 

Utilizamos esta al leer los valores del registro que han sido guardados como cadenas, y luego meterlos en el inmueble con la reflexión.

+2

nota: el tipo devuelto por GetSomeInput() debe implementar IConvertible (con la parte superior hacia abajo). Supongo que todos los tipos CLR .NET intrínsecos sí lo tienen. ;) –

+1

Cambié las respuestas. Aunque convertir es útil, devuelve un objeto. Lo que realmente necesitaba era el tipo real devuelto. –

+0

Aquí hay un caso de uso válido: desde una llamada a una biblioteca de terceros obtenemos un nombre de método, un PropertyInfo y un valor que siempre es un doble. Como los parámetros de varios métodos son enteros, nuestra aplicación se bloqueó. Con este código podemos convertir el doble recibido a ParameterInfo.ParameterType sin ningún problema. ¡Gracias! :) –

4

Puede usar el método Activator.CreateInstance para crear una instancia de un tipo.

FYI reflection es SLOOWWWW, por lo que si necesita hacer esto varias veces seguidas, puede ser mejor definir sus tipos en una enumeración o algo así y crear instancias sin usar el reflejo.

+0

¿Y cómo se crean instancias a partir de tipos almacenados en enumeración sin reflexión? – jayarjo

+0

C# enumeraciones no almacenan tipos, la enumeración específica es un tipo, cada instanciación de esa enumeración tiene un valor. Si desea utilizar una enumeración para crear un tipo a partir de entonces, debe utilizar una fábrica y codificarla para actualizar sus tipos. – Spence

-3

Puede utilizar getClass() que devuelve un objeto de clase a continuación, utilizar el método de fundición en el objeto Class para convertir el objeto a un objeto de tipo de clase que, de este modo:.

myObj.getClass() fundido (myObj)

+1

Eso es java no C# – George

Cuestiones relacionadas