有没有办法在运行时动态转换,如下面的伪代码:
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。任何的想法?有没有办法解决这个问题?
我已经在上面的特定情况下解决了这个问题,但是一般的方法会好很多,因为我正在使用的程序很大并且有很多内存泄漏需要删除。
答案 0 :(得分:2)
没有。您无法转换为编译时未知的任何类型。但是,c#确实有一个特殊的关键字来声明一个未知类型的变量 - 它是dynamic
。
您可以将其视为late binding的形式 - 变量的实际类型仅在运行时确定。
声明动态变量时,c#编译器实际上会创建一个object类型的变量,但不会执行任何类型检查。
动态类型使其发生的操作可以绕过编译时类型检查。相反,这些操作在运行时解决 ...
在大多数情况下,类型动态类似于类型对象。但是,包含dynamic类型表达式的操作不会被编译器解析或进行类型检查。编译器将有关操作的信息打包在一起,该信息稍后用于评估运行时的操作。作为过程的一部分,dynamic类型的变量被编译为object类型的变量。因此,类型dynamic仅在编译时存在,而不是在运行时存在。
答案 1 :(得分:0)
好吧,我会试一试。关于反射的部分有点令人困惑,但我认为你正在寻找的是Dispose
模式。
检查:https://msdn.microsoft.com/en-us/library/ms244737.aspx
所有需要清理代码的类,例如SerialNumberGridViewModel
将实施IDisposable
。从外面你可以转为IDisposable
并致电Dispose()
。每个对象自己决定现在必须做什么,例如删除Eventhandlers等等。
问候