2010-09-27 6 views
1

Je tente d'enregistrer dynamiquement des entités et des configurations avec un contexte (code uniquement EF4)VB.Net espace de noms Rechercher un type générique (réflexion)

Je normalement faire:

Private Shared Sub ConfigureDatabase(ByRef Builder As ContextBuilder(Of ContextExtension)) 
    'Load configurations for each of the tables (Entity sets) in our database... 
    ConfigureEntity(Builder, New ContactConfig) 
End Sub 

Private Shared Sub ConfigureEntity(Of T)(ByRef Builder As ContextBuilder(Of ContextExtension), ByVal config As EntityConfiguration(Of T), ByVal setName As String) 
    'Register the entity configuration with the builder 
    Builder.Configurations.Add(config) 

    'Register the entity set name with the builder 
    Builder.RegisterSet(Of T)(setName) 
End Sub 

ContactConfig est une classe qui hérite EntityConfiguration(Of Contact) et Contact est une classe qui implémente une interface IEntity (IEntity est commune à toutes les entités).

Alors ... Je dois rechercher un espace de noms (par exemple Project.DB.Client) pour toutes les signatures qui correspondent à:

EntityConfiguration(Of <Class which implements IEntity>) 

Comment puis-je y parvenir?

Répondre

1

L'espace de noms est juste une partie du nom de l'objet. Recherche de types qui héritent classe générique implique beaucoup plus d'efforts que le filtrage juste en espace de nom:

Private Function CheckType(ByVal type As Type) As Boolean 
    If (type Is GetType(Object)) Then ' object hierarhy root reached' 
     Return False 
    End If 
    If (type.IsGenericType) Then 
     ' inherits from some generic type' 
     Dim parameters = type.GetGenericArguments() 
     ' check if it has generic 1 parameter' 
     If parameters.Length = 1 Then 
      ' check if generic parameter is defined' 
      If Not (parameters(0).FullName Is Nothing) Then 
       ' check if parameter implements IEntity' 
       If GetType(IEntity).IsAssignableFrom(parameters(0)) Then 
        ' check if it is EntityConfiguration(Of T)' 
        If type Is GetType(EntityConfiguration(Of)).MakeGenericType(parameters) Then 
         Return True 
        End If 
       End If 
      End If 
     End If 
    End If 
    Return CheckType(type.BaseType) 
End Function 

Function FilterTypes(ByVal nameSpaceName As String, ByVal types As IEnumerable(Of Type)) As List(Of Type) 
    Dim result As New List(Of Type) 
    ' append . to namespace name' 
    nameSpaceName = nameSpaceName + "." 
    For Each type As Type In types 
     ' we do not need abstract classes, wont be able to create their instances anyway' 
     If (type.IsClass And Not type.IsAbstract And 
      type.FullName.StartsWith(nameSpaceName)) Then 
      ' check if type is inherited from EntityConfiguration(Of T)' 
      If (CheckType(type)) Then 
       result.Add(type) 
      End If 
     End If 
    Next 
    Return result 
End Function 

CheckType fonction vérifie si le type est héritée de EntityConfiguration(Of T).

FilterTypes La fonction filtre en outre les types par espace de noms et renvoie un résultat filtré.

Exemple: Dim types = FilterTypes("Project.DB.Client", Assembly.GetExecutingAssembly().GetTypes()).

+0

Merci - Je vais essayer cela et revenir vers vous. – Basic

+0

J'ai bien travaillé, merci – Basic

Questions connexes