J'ai écrit cet exemple pour aider à expliquer. Comme vous pouvez le voir, j'ai une hiérarchie d'objets. Je voudrais modifier la fonction GetFeatures() pour retourner uniquement les fonctionnalités ajoutées par le constructeur du type d'objet I instancié. Par exemple, BasicModel.GetFeatures (new LuxuryModel()) ne doit renvoyer que les fonctionnalités "Leather Seats" et "Sunroof". Cela ne me dérange pas d'utiliser la réflexion si je le dois.Comment filtrer une collection d'objets dans une classe de base en fonction du type de la sous-classe créée?
Public Class Feature
Public Sub New(ByVal model As BasicModel, ByVal description As String)
_model = model
_description = description
End Sub
Private _model As BasicModel
Public Property Model() As BasicModel
Get
Return _model
End Get
Set(ByVal value As BasicModel)
_model = value
End Set
End Property
Private _description As String
Public Property Description() As String
Get
Return _description
End Get
Set(ByVal value As String)
_description = value
End Set
End Property
End Class
Public Class BasicModel
Public Sub New()
_features = New List(Of Feature)
End Sub
Private _features As List(Of Feature)
Public ReadOnly Property Features() As List(Of Feature)
Get
Return _features
End Get
End Property
Public Shared Function GetFeatures(ByVal model As BasicModel) As List(Of Feature)
'I know this is wrong, but something like this...'
Return model.Features.FindAll(Function(f) f.Model.GetType() Is model.GetType())
End Function
End Class
Public Class SedanModel
Inherits BasicModel
Public Sub New()
MyBase.New()
Features.Add(New Feature(Me, "Fuzzy Dice"))
Features.Add(New Feature(Me, "Tree Air Freshener"))
End Sub
End Class
Public Class LuxuryModel
Inherits SedanModel
Public Sub New()
MyBase.New()
Features.Add(New Feature(Me, "Leather Seats"))
Features.Add(New Feature(Me, "Sunroof"))
End Sub
End Class
En VB cela ne filtre rien. Toutes les fonctionnalités sont toujours retournées. – adam0101
Peu importe que ce soit fait en VB ou en C#. Si vous utilisez une clause Where comme cela, et les types sont en effet différents (notez que GetType ne compare pas les types de base des deux, seulement le type exact de chaque instance), alors vous devriez obtenir une liste filtrée. Si cela ne fonctionne pas, alors la seule option est que chaque caractéristique du modèle donné soit pour le modèle que vous avez passé. – jrista