在VB.NET中将类型转换为List(Of T)

5
在C#中,可以将类型转换为List<T>,因此如果您有以下内容:
List<Activity> _Activities;
List<T> _list;

以下方法可行:
_list = _Activities as List<T>;

但是使用VB.NET翻译的那一行是:

_list = TryCast(_Activities, List(Of T))

抛出编译错误。我已经仔细搜索并尝试使用LINQ来解决这个问题,但没有找到方法。有任何想法吗?
谢谢。
Crispin

您对“将会工作”的定义有些奇怪。如果您确实有一个名为T的类,它可能会编译通过,但实际运行时会引发InvalidCastException异常。 - Ben Voigt
我刚从Julie Lerman的Entity Framework书中摘取了一段代码片段,因此我认为她已经让它工作了。虽然我可以阅读很多C#代码,但仍有一些结构对我来说是陌生的。 - CrispinH
3个回答

7

我重现了这个问题,从技术上讲,这应该是可能的。但明显编译器并不认同。不过解决方法很简单:

    Dim _Activities As New List(Of Activity)
    Dim o As Object = _Activities
    Dim tlist = TryCast(o, List(Of T))

或者作为一行代码:
    Dim tlist = TryCast(CObj(_Activities), List(Of T))

JIT编译器应该优化临时变量,这样就不会产生额外的开销。

直接抛出一个“InvalidCastException”不是更容易吗? - Ben Voigt
这似乎解决了问题。我正在跟随Julie Lerman的Entity Framework书籍,还有一些工作要做,才能使代码运行起来。 - CrispinH
Hans!感谢你的修复。我已经能够修复这个方法并解决一些其他转换问题,这是vb转换应用程序无法解决的,并使VB解决方案完全适用于此章节(第26章)。它可以在http://learnentityframework.com/LearnEntityFramework/downloads/#2ed上获得。 - Julie Lerman

1

您可以使用通用的List.ConvertAll方法。

给定一个List,该方法将使用您提供的转换器函数返回不同类型的List。

我链接的MSDN文章有一个很好的例子。


0

我总是使用 DirectCast(object, type)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接