在运行时动态转换

时间:2017-03-28 11:33:39

标签: c# wpf dynamic types casting

有没有办法在运行时动态转换,如下面的伪代码:

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。任何的想法?有没有办法解决这个问题?

我已经在上面的特定情况下解决了这个问题,但是一般的方法会好很多,因为我正在使用的程序很大并且有很多内存泄漏需要删除。

2 个答案:

答案 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等等。

问候