C#铸造问题

C#铸造问题,c#,casting,C#,Casting,我有这样的密码: myDataGrid是传递给方法的对象。我知道这是不同类型的OvserveableCollection类型。 我只需要将该对象强制转换为OvserveableCollection(它实现IEnumerable接口) //获取元素的类型 类型entryType=(myDataGrid作为IEnumerable.AsQueryable().ElementType; foreach(在(IEnumerable)myDataGrid中的变量项) {} 但是编译器不知道循环头中的ent

我有这样的密码:

myDataGrid
是传递给方法的对象。我知道这是不同类型的
OvserveableCollection
类型。 我只需要将该对象强制转换为
OvserveableCollection
(它实现
IEnumerable
接口)

//获取元素的类型
类型entryType=(myDataGrid作为IEnumerable.AsQueryable().ElementType;
foreach(在(IEnumerable)myDataGrid中的变量项)
{}

但是编译器不知道循环头中的
entryType
。为什么?

您试图使用
类型
变量作为泛型类型的类型参数。泛型不是这样工作的-必须使用编译时类型作为类型参数。(如果在泛型方法中执行此操作,则编译时类型本身可以是类型参数。)


在不了解更多需求的情况下,很难知道如何建议您更改代码-您需要如何处理这些项?

除非使用反射(
MakeGenericMethod()
/
MakeGenericType()
),否则不能将运行时
Type
实例用作泛型类型参数。然而,我怀疑它是否会有帮助!在这种情况下,可以使用非通用的
IEnumerable
(no
)API,也可以强制转换为已知的接口/子类,或者使用
动态
作为最后手段

您也可以使用
MakeGenericMethod()
等,但这更复杂,而且几乎肯定会更慢

例如:

foreach(object item in (IEnumerable)myDataGrid)
{
     // tada!
}
另一个技巧是使用
dynamic
调用通用代码:

public void Iterate<T>(IEnumerable<T> data)
{
     foreach(T item in data) {...}
}
...
dynamic evil = myDataGrid;
Iterate(evil);
public void Iterate(IEnumerable数据)
{
foreach(数据中的T项){…}
}
...
动态邪恶=myDataGrid;
反复(邪恶);
您不能强制转换为“运行时类型”。。。为了“编写”实际实现该转换的指令,编译器需要类型。。。这实际上只是意味着必须在编译时知道类型

我发现的唯一绕过这个限制的方法是代码生成器(一种或另一种)来“手动”生成IL指令以执行强制转换。除非我们非常了解您的实际需求(和约束),否则很难知道推荐什么


干杯。Keith.

我需要遍历该ObservableCollection以读取每个数据库中的数据element@Tony:您可以像
对象
一样执行此操作-为什么需要更具体的编译时类型?我不知道新的
动态
类型。是的,它是邪恶的,因此我想我会喜欢它的。曾经是脚本兔子,永远是黑客。谢谢你的鱼;-)是 啊不幸的是,我正忙着将我们的应用升级到3.5,因为在我们开始这一轮疯狂游戏时,Z4.0还没有推出。。。唉。
public void Iterate<T>(IEnumerable<T> data)
{
     foreach(T item in data) {...}
}
...
dynamic evil = myDataGrid;
Iterate(evil);