Pregunta

Estoy tratando de escribir algo de código para convertir los datos de un campo de tipo de objeto (provienen de un conjunto de datos) en su destino (a máquina) Campos. Que estoy haciendo (tratando por lo menos) usando conversión dinámica. Parece que funciona bien para cuerdas, int, DateTime.

Pero no funciona para los tipos sin signo (ULONG, uint). A continuación hay un código simple que muestra lo que quiero hacer. Si cambia el tipo de ul var ULONG a int, que funciona bien.

¿Alguien tiene una pista?

public class console
{

    public static void CastIt<T>(object value, out T target)
    {
        target = (T) value;
    }

    public static void Main()
    {
        ulong ul;
        string str;
        int i;
        DateTime dt;

        object ul_o = (object) 2;
        object str_o = (object) "This is a string";
        object i_o = (object)1;
        object dt_o = (object) DateTime.Now;

        Console.WriteLine("Cast");

        CastIt(ul_o, out ul);
        CastIt(str_o, out str);
        CastIt(i_o, out i);
        CastIt(dt_o, out dt);

        Console.WriteLine(ul);
        Console.WriteLine(str);
        Console.WriteLine(i);
        Console.WriteLine(dt.ToString());
    }

}
¿Fue útil?

Solución

Como dice Andrés, el problema es que no se puede desempacar de una caja int a ulong.

Hay dos opciones:

1) caja un lugar ulong:

object ul_o = (object) 2UL;

o

ulong tmp = 2;
object ul_o = tmp;

2) Hacer uso CastIt<T> Convert.ChangeType:

public static void CastIt<T>(object value, out T target)
{
    target = (T) Convert.ChangeType(value, typeof(T));
}

Esto es un poco mal, pero funciona con el código de ejemplo. Si puede utilizar la primera forma en que su código real, eso sería mejor.

Otros consejos

Eso es porque su objeto ul_o es un entero, no un número sin signo. Cuando usted está en su función de conversión, que está lanzando al tiempo que los datos de destino en el contexto de un object. operadores de conversión explícita / implícita (que es lo que se necesita utilizar) sólo funcionan cuando se tiene el objeto en el contexto de un tipo que las implementa (ya que los operadores están enlazados estáticamente en tiempo de compilación en lugar de forma dinámica en tiempo de ejecución).

Si esto es realmente lo que quiere hacer, en lugar de sólo un elenco recta, utilice la siguiente:

target = (T)Convert.ChangeType(value, typeof(T));

El CLR no permite que usted eche de esta manera debido a su tipo de valor en caja es de hecho un int:

object ul_o = (object)2;

Cuando usted está tratando de convertirse a un ulong que no puede porque no se puede desempacar un int directamente en un ulong.

Creo que lo que quiere es más parecido (no probado, pero direccionalmente correcta) ...

public static void CastIt<T>( object value ) where T : IConvertable
{
  return ( T )Convert.ChangeType( value , typeof( T ) );
}

Editar: recogió por Skeet! :)

Esto no es realmente una respuesta a su pregunta; Sólo quería mencionar que si está utilizando .Net 3.5, el LINQ a conjuntos de datos código incluye funcionalidad como lo que se está implementando. El método de extensión específico sería Campo () de la clase DataRow.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top