2009-04-02 13 views
4

J'ai un ensemble d'assemblages .NET (tous dans le même répertoire) et certains d'entre eux contiennent des classes qui implémentent une classe abstraite. Je voudrais qu'un script Powershell trouve toutes les classes qui implémentent ma classe abstraite, et exécute une méthode sur chacune d'entre elles.Réflexion avec Powershell

Est-ce que quelqu'un a une idée sur la façon de faire cela?

Merci!

Répondre

3

Voici une petite fonction que vous pourriez vouloir essayer .. (je ne l'ai pas encore testé, car je ne dispose pas de critères pour tester cela avec facilement ..)

Il peut être utilisé en fournissant les chemins (un ou plusieurs chemins complets ou relatifs séparés par des virgules) sur la ligne de commande de ce type

CheckForAbstractClassInheritance -Abstract System.Object -Assembly c:\assemblies\assemblytotest.dll, assemblytotest2.dll 

ou de la canalisation

'c:\assemblies\assemblytotest.dll','assemblytotest2.dll' | CheckForAbstractClassInheritance -Abstract System.Object 

ou avec des objets Fileinfo de Get-Childitem (dir)

dir c:\assemblies *.dll | CheckForAbstractClassInheritance -Abstract System.Object 

Tweak au besoin ..

function CheckForAbstractClassInheritance() 
{ 
    param ([string]$AbstractClassName, [string[]]$AssemblyPath = $null) 
    BEGIN 
    { 
     if ($AssemblyPath -ne $null) 
     { 
      $AssemblyPath | Load-AssemblyForReflection 
     } 
    } 
    PROCESS 
    { 
     if ($_ -ne $null) 
     { 
      if ($_ -is [FileInfo]) 
      { 
       $path = $_.fullname 
      } 
      else 
      { 
       $path = (resolve-path $_).path 
      } 
      $types = ([system.reflection.assembly]::ReflectionOnlyLoadFrom($path)).GetTypes() 
      foreach ($type in $types) 
      { 
       if ($type.IsSubClassOf($AbstractClassName)) 
       { 
        #If the type is a subclass of the requested type, 
        #write it to the pipeline 
        $type 
       } 
      } 

     } 
    } 
} 
+0

Le seul problème ici est que vous ne pouvez pas instancier des classes ou exécuter des méthodes d'assemblées qui ont été chargés de la réflexion que. – x0n