3

我正在尝试编写一些代码来将来自对象类型字段(来自 DataSet)的数据转换为它的目标(类型化)字段。我正在(至少尝试)使用动态转换。它似乎适用于字符串、int、DateTime。

但它不适用于无符号类型(ulong、uint)。下面有一个简单的代码,显示了我想要做什么。如果将 ul var 类型从 ulong 更改为 int,它可以正常工作。

有人有线索吗?

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

}
4

5 回答 5

12

正如安德鲁所说,问题是你不能从一个装箱int的到ulong.

两种选择:

1)ulong改为框 a:

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

这有点臭,但适用于您的示例代码。如果您可以在真实代码中使用第一种方式,那就更好了。

于 2009-04-21T18:42:23.303 回答
3

那是因为你的 ul_o 对象是一个整数,而不是一个无符号数。当你在你的转换函数中时,你是在将目标数据放在object. 显式/隐式转换运算符(这是您需要使用的)仅当您在实现它们的类型的上下文中拥有对象时才起作用(因为这些运算符在编译时静态链接而不是在运行时动态链接)。

如果这真的是你想要做的,而不是直接演员,使用这个:

target = (T)Convert.ChangeType(value, typeof(T));
于 2009-04-21T18:39:28.707 回答
0

CLR 不允许您以这种方式进行转换,因为您的装箱值类型实际上是一个 int:

object ul_o = (object)2;

当您尝试投射到 aulong时,您不能,因为您不能将 aint直接拆箱到ulong.

于 2009-04-21T18:39:20.237 回答
0

我认为你想要的更像(未经测试,但方向正确)......

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

编辑:被Skeet舀!:)

于 2009-04-21T18:44:35.730 回答
0

这不是您问题的真正答案;只是想提一下,如果您使用的是 .Net 3.5,则Linq to DataSets代码包括您正在实现的功能。具体的扩展方法是 DataRow 类上的 Field<T>()。

于 2009-04-21T18:46:10.470 回答