Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将泛型类型T的对象转换为特定类型_.net_Vb.net - Fatal编程技术网

.net 将泛型类型T的对象转换为特定类型

.net 将泛型类型T的对象转换为特定类型,.net,vb.net,.net,Vb.net,我已经使用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 但是如何将对

我已经使用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
但是如何将对象强制转换为这种类型?我试过了

Dim lObject As Company = DirectCast(Me, Company)
但这似乎与信息不符

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

如果EditableBase类正在执行类似的操作,那么它显然无法工作:

If GetType(T) Is GetType(Company) Then
    Dim o As Company = DirectCast(Me, Company)  ' Fails to compile
End If
你不能这么做,因为我显然是公司EditableBaseOf的一个实例。无法自动将EditableBaseOf t转换为Company。编译器知道这些类型,并且知道它们不兼容,所以它不允许这样做。然而,既然您知道,在本例中,T是Company,Company确实继承自Company的EditableBaseOf,那么您可以通过首先将其转换为Object来欺骗它。编译器将始终允许您从对象强制转换到任何其他对象

If GetType(T) Is GetType(Company) Then
    Dim o As Company = DirectCast(DirectCast(Me, Object), Company)  ' Compiles successfully
End If
然而,在我看来,所有这些似乎都是糟糕设计的迹象。首先,没有受到这样的约束是相当奇怪的。而且,让基类检查派生类的特定具体类型,就像这样,几乎可以肯定是一个迹象,表明它可以以更好的方式设计

根据定义,基类应该始终以相同的方式工作,而不管派生类的类型如何。如果出于某种原因,必须这样做,那么继承关系就根本不是真的。例如,如果一个名为Animal的基类有条件逻辑,当它是一只猫时,它的行为会有所不同,那么从逻辑上讲,你不能说猫和狗都是动物类型。这就像说动物是有生命的东西,除非它不是,在这种情况下,有时它也是有生命的。我想用这种方式来定义某件事是可能的,但它变成了一个毫无意义的定义


类似地,泛型类不应根据其泛型类型参数的类型而采取不同的行动,即,如果出于某种原因,泛型类必须,那么它们根本就不是泛型的。

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

有一个操作符来检查特定类型的对象是否正确。还有,CType。。。不存在DirectCast。可能存在@Agat CTypeMe的副本,公司无法以与DirectCast相同的方式编译。编写此文件不好,但只是暂时的,因为正确的方法需要更多的工作,现在需要快速修复。我将尝试对象。谢谢
If GetType(T) Is GetType(Company) Then
    Dim o As Company = DirectCast(DirectCast(Me, Object), Company)  ' Compiles successfully
End If