【发布时间】:2017-08-21 11:05:23
【问题描述】:
有没有办法像下面的伪代码那样在运行时动态转换:
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。任何想法?有没有办法解决这个问题?
我已经在上述特定情况下解决了这个问题,但是一般的方法会好很多,因为我正在使用的程序很大并且有很多内存泄漏需要删除。
【问题讨论】:
-
不确定你的意思。你能举个例子吗?
-
不,因为这没有任何意义。您将如何使用
cellContent,因为您仍然不知道类型是什么。如果您知道要访问的成员,那么最好的解决方案是创建一个包含这些成员的类型(例如接口或基类),然后强制转换为该类型。如果做不到,请使用dynamic或反射。 -
你的伪代码目前什么都不做。目前还不清楚你在问什么。内存泄漏是完全不同的故事,要么删除它,要么问另一个问题。
-
有些误会。如果您不知道“cellContent”变量的类型,您能否举例说明接下来要对“cellContent”变量做什么?可能是反射是你在找什么?
-
@Sinatr:如果我将 cellContent 转换为它实际存在的对象,我可以删除它的事件。标记为伪代码的行只是为了演示我实际尝试做的事情 - 它确实如此。那为什么还不清楚呢?
标签: c# wpf dynamic types casting