2008-12-28 7 views
2

Je me demande s'il existe une fonction équivalente à call_user_func() de PHP dans l'application ASP.NET. Je cherche à faire une conversion d'une application PHP à ASP.NET pour m'enseigner la langue, en prenant un CMS que j'ai construit professionnellement et en essayant de le recréer dans cette autre langue. La raison pour laquelle j'ai besoin d'une fonction similaire est que la structure actuelle de mon CMS PHP implique une architecture de plugin, et que des parties spécifiques du CMS s'exposent pour les plugins, et il gère ensuite les informations retournées sous forme de tableau . C'est à peu près le même système que Drupal utilise.PHP à ASP.NET - call_user_func() équivalent?

Suis-je peut-être sur la mauvaise voie avec ceci?

Je pense que des éclaircissements je donner un exemple de la façon dont cela fonctionne dans mon système actuel:

<?php 
class Test { 

    function TestMessage() { 
     // set up array 
     $arrTest = array("Hello", "World"); 
     // get extra values from all available plugins 
     $arrExtras = CMS::InvokeHook("HelloTest"); 
     // now contains Hello, World, Foo, Bar 
     $arrTests = array_merge($arrTest, $arrExtras); 
    } 

} 

class CMS { 
    InvokeHook($function) { 
     // now contains a couple plugins 
     $plugins = CMS::GetPlugins(); 
     // empty array of values 
     $values = array(); 
     foreach($plugins as $plugin) { 
      // if this plugin has the called method... 
      if(method_exists($plugin, $function)) { 
       // call the function and merge in the results 
       $values[] = call_user_func(array($plugin, $function)); 
      } 
     } 
     // return results as an array 
     return $values; 
    } 
} 

class FooTest { 
    function HelloTest() { 
     return "Foo"; 
    } 
} 

class BarTest { 
    function HelloTest() { 
     return "Bar"; 
    } 
} 

?> 

REMARQUE: L'appel InvokeHook() est simplifiée comme je l'écris ceci de la mémoire, mais qui est l'essentiel de celui-ci.

+0

pouvez-vous expliquer à nous développeurs ASP.NET ce que cela fonctionne? –

+0

Ceci appelle une méthode d'un nom donné sous la forme d'une chaîne. Si vous passez dans un tableau, la première chaîne est la classe et la seconde est le nom de la fonction. Vous pouvez également passer un nombre quelconque d'arguments que les fonctions peuvent utiliser (ma méthode actuelle InvokeHook l'utilise) – spelley

Répondre

3

Dans .NET je créerais probablement des événements et les manipulerais. Voici une façon de le faire:

public class CMS 

    public Event DoSomethingHook(byval sender as Object, byval e as DoSomethingEventArgs) 

    public function DoSomething() 
     dim data() as Integer = {} 
     Dim e as new DoSomethingEventArgs(); 
     e.data = data 
     RaiseEvent DoSomethingHook(Me, e) 
     data = e.data 
    end function 
end class 


' Let's say Plugin base class contains a reference to CMS 
public class CMSPlugin 
    Inherits Plugin 

    public sub New() 
     ' Register for a hook 
     AddHandler CMS.DoSomethingHook, AddressOf DoSomething 
    end sub 

    public function DoSomething(byval sender as Object, byval e as DoSomethingEventArgs) 
     ' Do something with e.data 
    end function 
end class 

public class DoSomethingEventArgs : Inherits EventArgs 
    public data() as Integer 
end class 
0

Pour les développeurs .NET, il s'agit essentiellement d'une méthode d'appel d'une méthode à partir d'un nom donné (sous forme de chaîne).

À l'OP: (Je pense) Vous devez utiliser la réflexion. C'est loin d'être aussi joli et c'est assez cher (IIRC) donc il vaut mieux ne pas trop l'utiliser.

System.Reflection.MethodInfo method = this.GetType().GetMethod(myMethodName); 
// method.Invoke(args, null); 

Je pense que vous pourriez peut-être faire les choses comme « mauvaise » si vous devez recourir à cela pour faire avancer les choses. Il est possible qu'un motif plus propre fonctionne mieux. La façon dont j'ai fait les plugin-architectures est à travers des interfaces partagées globalement * donc les plugins peuvent implémenter une interface "plug-in" * et alors je sais qu'il y aura une méthode .DoSomething() (etc) disponible . Aucune réflexion nécessaire =)

* Ou des classes abstraites .. Vraiment, tout ce qui convient le mieux!