【问题标题】:Convert object of generic type T to a specific type将泛型类型 T 的对象转换为特定类型
【发布时间】:2015-01-01 22:14:45
【问题描述】:

我已经声明了一个基类(使用 CSLA.NET)

Public Class EditableBase(Of T As EditableBase(Of T))
    Inherits BusinessBase(Of T)

End Class

我有我的 Company 类,它继承自这个基类并声明为这样

<Serializable()> _
Public Class Company
    Inherits EditableBase(Of Company)

End Class

现在在我的代码中,我需要检查类型是否为 Company 类型,我可以这样做

If GetType(T) Is GetType(Company) Then

但是我怎样才能将对象转换为这种类型呢?我试过了

Dim lObject As Company = DirectCast(Me, Company)

但这似乎与消息错误

“T”类型的值无法转换为 Company 类型

【问题讨论】:

  • Is 操作符来检查是否是某种类型的对象。此外,存在CType(...) 而不是DirectCast
  • @Agat CType(Me, Company) 在这种情况下无法像 DirectCast 那样编译。

标签: .net vb.net


【解决方案1】:

如果EditableBase 类正在做这样的事情,它显然是行不通的:

If GetType(T) Is GetType(Company) Then
    Dim o As Company = DirectCast(Me, Company)  ' Fails to compile
End If

您不能这样做,因为Me 显然是EditableBase(Of Company) 的一个实例。您无法自动从 EditableBase(Of T) 转换为 Company。编译器知道类型并且知道它们不兼容,所以它不允许这样做。但是,既然您知道,在这种情况下,TCompany,并且Company 确实继承自EditableBase(Of Company),您可以通过首先转换为Object 来欺骗它工作。编译器将始终允许您从 Object 转换为其他任何内容。

If GetType(T) Is GetType(Company) Then
    Dim o As Company = DirectCast(DirectCast(Me, Object), Company)  ' Compiles successfully
End If

然而,在我看来,所有这一切都是糟糕设计的迹象。首先,以这种方式限制T 是相当奇怪的。此外,让基类检查派生类的特定具体类型,几乎可以肯定,这表明它可以以更好的方式设计。

根据定义,无论派生类的类型如何,基类都应始终以相同的方式运行。如果出于某种原因必须如此,那么继承关系根本就不是真的。例如,如果名为Animal 的基类具有条件逻辑,当它是Cat 时,它的行为会有所不同,那么您就不能从逻辑上说CatDog 都是@987654339 的类型@。这就像说动物是有生命的东西,除非它不是,在这种情况下有时它也是。我想这样定义是可能的,但它变成了一个毫无意义的定义。

同样,泛型类不应根据其泛型类型参数的类型(即T)而采取不同的行动。如果出于某种原因,它们必须这样做,那么它们根本就不是真正通用的。

【讨论】:

  • 写这个不好,但只是暂时的,因为“正确”的方式来做这将需要更多的工作,现在想要一个快速修复。我会尝试对象。谢谢
【解决方案2】:

听起来您需要从接口或基类而不是泛型 (T) 实现。泛型在设计上应该对不同类型非常开放,而您正在尝试将其限制为类的子集,因此应该使用基类或接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多