Domanda

Sto cercando di scrivere del codice per convertire i dati da un campo tipo di oggetto (provenire da un DataSet) nella sua destinazione (dattiloscritte) Campi. Sto facendo (cercando almeno) utilizzando conversione dinamica. Sembra funzionare bene per le stringhe, INT, DateTime.

Ma non funziona per i tipi senza segno (ulong, uint). Qui di seguito c'è un semplice codice che mostra ciò che voglio fare. Se si cambia il tipo ul var da Ulong a int, funziona benissimo.

Qualcuno ha un indizio?

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());
    }

}
È stato utile?

Soluzione

Come dice Andrew, il problema è che non si può Unbox da un int boxed per ulong.

Due opzioni:

1) Box un ulong invece:

object ul_o = (object) 2UL;

o

ulong tmp = 2;
object ul_o = tmp;

2) Sfruttate CastIt<T> Convert.ChangeType:

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

Questo è un po 'puzzolente, ma funziona con il vostro codice di esempio. Se è possibile utilizzare il primo modo nel codice vero e proprio, che sarebbe meglio.

Altri suggerimenti

Questo perché l'oggetto ul_o è un int, non un numero senza segno. Quando sei nella funzione di fusione, si sta gettando pur avendo i dati di destinazione nel contesto di un object. / operatori del cast impliciti esplicita (che è quello che avresti bisogno di utilizzare) funzionano solo quando si ha l'oggetto nel contesto di un tipo che li implementa (dal momento che gli operatori sono staticamente collegati al momento della compilazione, piuttosto che in modo dinamico in fase di esecuzione).

Se questo è veramente quello che si vuole fare, invece di un cast dritta, utilizzare questo:

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

Il CLR non consente di lanciare in questo modo perché il tipo di valore in scatola è in realtà un int:

object ul_o = (object)2;

Quando si sta tentando di lanciare un ulong non è possibile perché non si può unboxing int direttamente in un ulong.

Credo che ciò che si vuole è più simile (non testato, ma direzionalmente corretto) ...

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

Modifica: scavata da Skeet! :)

Questo non è davvero una risposta alla tua domanda; Volevo solo ricordare che se si sta utilizzando .Net 3.5, il LINQ to DataSet codice include funzionalità come quello che si sta implementando. Il metodo di estensione specifica sarebbe Campo () sulla classe DataRow.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top