Frage

Ich versuche, einige Code zu schreiben, um Daten von einem Objekttyp Feld zu konvertieren (kommen aus einem DataSet) hinein Ziel (typisiert) Felder ist. Ich mache (zumindest versuchen) es mit dynamische Konvertierung. Es scheint für Streicher, int, Datetime zu funktionieren.

Aber es funktioniert nicht für unsigned Typen (ulong, uint). Unten gibt es einen einfachen Code, der zeigt, was ich tun möchte. Wenn Sie den ul var Typen von Ulong int ändern, es funktioniert gut.

Hat jemand eine Ahnung haben?

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

}
War es hilfreich?

Lösung

Wie Andrew sagt, das Problem ist, dass man nicht von einem boxed int unbox kann ulong.

Zwei Optionen:

1) Box eine ulong statt:

object ul_o = (object) 2UL;

oder

ulong tmp = 2;
object ul_o = tmp;

2) Stellen CastIt<T> Verwendung Convert.ChangeType:

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

Dies ist ein wenig muffig, aber arbeitet mit Ihrem Beispielcode. Wenn Sie die erste Möglichkeit, in Ihrem realen Code verwenden können, das wäre besser.

Andere Tipps

Das ist, weil Ihr ul_o Objekt ein int ist, nicht eine Zahl ohne Vorzeichen. Wenn Sie in Ihre Umsetzungsfunktion sind, werfen Sie während im Rahmen eines object die Zieldaten. Explizite / implizite Cast-Operatoren (das ist, was Sie verwenden bräuchten) nur dann funktionieren, wenn Sie das Objekt im Rahmen eines Typs, die sie implementiert (da diese Betreiber bei der Kompilierung statisch gelinkt werden, anstatt dynamisch zur Laufzeit).

Wenn dies wirklich das, was Sie tun wollen, anstatt nur eine gerade gegossen, diese verwenden:

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

Die CLR erlaubt Ihnen nicht, auf diese Weise zu werfen, weil Ihr boxed Werttyp in der Tat ist ein int:

object ul_o = (object)2;

Wenn Sie zu einem ulong zu werfen versuchen, können Sie nicht, weil Sie keine int direkt in eine ulong unbox können.

Ich denke, was Sie wollen mehr wie ist (nicht getestet, aber richtungs korrigieren) ...

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

Edit: Scooped von Skeet! :)

Das ist nicht wirklich eine Antwort auf Ihre Frage; erwähnen wollte nur, dass, wenn Sie mit .NET 3.5, a href die <= "http://blogs.msdn.com/adonet/archive/2007/01/26/querying-datasets-introduction-to-linq-to -dataset.aspx“rel = "nofollow noreferrer"> Linq to Datasets Code Funktionalität wie das, was Sie implementieren enthält. Die spezifische Erweiterungsmethode wäre Feld () auf der DataRow-Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top