有没有一种方法可以在运行时动态转换,如以下伪代码:
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
if (row[col] != DBNull.Value)
{
Type type = col.DataType;
type cellContent = (type)row[col]; //Pseudo-Code
}
}
}
我一直在网上搜索但没有找到任何东西。有object obj = Activator.CreateInstance(type);
,但是我仍然坚持使用一个对象,并且无法使用它的特定类型方法。另外,我需要对现有对象进行强制转换,而不是新实例。我需要从 CellContent 中删除所有 EventHandler,因为在某些情况下它们会导致内存泄漏,例如:对象类型是 IList[SerialNumberGridViewModel] 且 SerialNumberGridViewModel 实现了 PropertyChanged-Handler,这导致了内存泄漏。任何想法?有办法解决这个问题吗?
我已经在上述特定情况下解决了这个问题,但是通用方法会好得多,因为我正在使用的程序很大并且有很多内存泄漏需要删除。
不可以。您不能转换为编译时未知的任何类型。然而,c# 确实有一个特殊的关键字来声明未知类型的变量 - 它是dynamic https://msdn.microsoft.com/en-us/library/dd264741.aspx.
你可以把它想象成一种形式后期绑定 http://www.c-sharpcorner.com/uploadfile/babu_2082/early-binding-vs-late-binding/- 变量的实际类型仅在运行时确定。
当声明动态变量时,C#编译器实际上创建了一个对象类型的变量,但不执行任何类型检查。
动态类型使得发生该类型的操作能够绕过编译时类型检查。相反,这些操作在运行时解决。
...
在大多数情况下,动态类型的行为类似于对象类型。但是,编译器不会解析或检查包含动态类型表达式的操作。编译器将有关操作的信息打包在一起,并且该信息稍后用于在运行时评估操作。作为该过程的一部分,dynamic 类型的变量被编译为 object 类型的变量。因此,类型dynamic仅存在于编译时,而不存在于运行时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)