我尝试写一些代码将数据从一个对象类型字段转换(来自一个DataSet)到它的目的地(类型)的字段。我正在做使用(至少尝试) 动态转换。它似乎做工精细字符串,整型,日期时间。

不过,这并不对无符号类型(ULONG,UINT)工作。下面有一个简单的代码,显示了我想做的事情。如果从乌龙为int改变UL变种类型,它工作正常。

是否有人有线索?

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

}
有帮助吗?

解决方案

由于安德鲁说,问题是,你不能从一个盒装intulong拆箱。

有两个选项:

1)箱A ulong代替:

object ul_o = (object) 2UL;

ulong tmp = 2;
object ul_o = tmp;

2)请CastIt<T>使用Convert.ChangeType

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

这是一个有点臭,但您的示例代码工作。如果你能在你真正的代码中使用第一种方式,这将是更好的。

其他提示

这是因为你的ul_o对象是一个int,而不是一个无符号数。当您在转换函数的时候,你铸造,同时具有在object的上下文中的目标数据。显式/隐式转换操作符(这是你需要使用什么),只有当你有一个类型的实现他们(因为这些运营商都在编译时在运行时的静态连接而不是动态)上下文对象工作。

如果这真的是你想要做什么,而不是只直投,这样使用:

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

在CLR不允许你,因为你的装箱值类型实际上是一个int投这种方式:

object ul_o = (object)2;

当您正试图转换为ulong你不能因为你不能直接拆箱一个intulong

我想你想要的是更喜欢(未经测试,但定向改正)...

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

编辑:由碟舀! :)

这是不是一个真正的回答你的问题;只是想提一提,如果你使用的是.NET 3.5中,的 LINQ到数据集代码包括像你要实现的功能。特定扩展方法将在DataRow类是场()。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top