C#:使用泛型铸造一个目的是一无符号的数式
题
我尝试写一些代码将数据从一个对象类型字段转换(来自一个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());
}
}
解决方案
由于安德鲁说,问题是,你不能从一个盒装int
到ulong
拆箱。
有两个选项:
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
你不能因为你不能直接拆箱一个int
成ulong
。
我想你想要的是更喜欢(未经测试,但定向改正)...
public static void CastIt<T>( object value ) where T : IConvertable
{
return ( T )Convert.ChangeType( value , typeof( T ) );
}
编辑:由碟舀! :)
这是不是一个真正的回答你的问题;只是想提一提,如果你使用的是.NET 3.5中,的 LINQ到数据集代码包括像你要实现的功能。特定扩展方法将在DataRow类是场
不隶属于 StackOverflow