Question

Je suis en train d'écrire un code pour convertir les données d'un champ de type d'objet (provenir d'un DataSet) dans sa destination (dactylographiées) champs. Je fais (au moins essayer) à l'aide conversion dynamique. Il semble fonctionner très bien pour cordes, int, DateTime.

Mais il ne fonctionne pas pour les types non signés (ULONG, uint). Ci-dessous, il y a un code simple qui montre ce que je veux faire. Si vous changez le type ul var de ULONG int, il fonctionne très bien.

Quelqu'un at-il un indice?

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

}
Était-ce utile?

La solution

Comme le dit Andrew, le problème est que vous ne pouvez pas Unbox d'un int à boxed ulong.

Deux options:

1) a encadré ulong à la place:

object ul_o = (object) 2UL;

ou

ulong tmp = 2;
object ul_o = tmp;

2) Faire CastIt<T> utilisation Convert.ChangeType:

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

Ceci est un peu mauvais, mais fonctionne avec votre code d'exemple. Si vous pouvez utiliser la première manière dans votre code réel, ce serait mieux.

Autres conseils

C'est parce que votre objet ul_o est un entier, et non un nombre non signé. Lorsque vous êtes dans votre fonction de coulée, vous coulée tout en ayant les données cibles dans le cadre d'un object. Explicites / opérateurs de la distribution implicite (ce qui est ce que vous devez utiliser) ne fonctionnent que lorsque vous avez l'objet dans le contexte d'un type qui les met en œuvre (puisque ces opérateurs sont liés statiquement au moment de la compilation plutôt que dynamiquement lors de l'exécution).

Si cela est vraiment ce que vous voulez faire, au lieu d'une distribution droite, utilisez ceci:

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

Le CLR ne vous permet pas de jeter de cette façon parce que votre type de valeur boxed est en fait un int:

object ul_o = (object)2;

Lorsque vous essayez de jeter un ulong vous ne pouvez pas parce que vous ne pouvez pas unbox un int directement dans un ulong.

Je pense que ce que vous voulez est plus comme (non testé, mais corriger directionnellement) ...

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

Edit: Creusé par Skeet! :)

Ce n'est pas vraiment une réponse à votre question; Je voulais juste dire que si vous utilisez .Net 3.5, le LINQ to DataSets le code inclut des fonctionnalités comme ce que vous implémentez. La méthode d'extension spécifique serait Champ () de la classe DataRow.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top