2008-12-28 33 views
2

我想知道在ASP.NET應用程序中是否有與PHP的call_user_func()等效的函數。我期待從PHP應用程序到ASP.NET的轉換,作爲自學語言的一種方式,通過採用專業構建的CMS並嘗試以其他語言重新創建CMS。PHP到ASP.NET - call_user_func()等效?

我需要一個類似於這個功能的原因是因爲我的PHP CMS的當前結構涉及插件體系結構,並且CMS的特定部分公開自己的插件,然後它將返回的信息作爲數組處理。這幾乎與Drupal使用的系統相同。

我可能在這個錯誤的軌道?

我想澄清,我應該提供的是如何工作的我目前的系統中的實例:

<?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"; 
    } 
} 

?> 

注:InvokeHook()調用被簡化,因爲我從內存中寫入這一點,但這是它的要點。

+0

你能向我們解釋一下ASP.NET開發人員這個函數是幹什麼的嗎? – 2008-12-28 20:27:29

回答

3

在.NET中,我可能會創建一些事件並處理它們。這裏有一種方法:

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

對於.NET開發人員來說,這基本上是一個從給定名稱(作爲字符串)調用方法的方法。

到OP:(我認爲)你必須使用反射。它遠沒有那麼漂亮,而且相當昂貴(IIRC),所以最好不要過度使用。

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

我覺得你有可能會做的事「錯誤」的方式,如果你不得不求助於此,把事情做好。有可能更好的清潔模式。

我製作插件架構的方式是通過全局共享接口*,因此插件可以實現一個「插件」接口*然後我知道會有一個.DoSomething()(etc)方法可用。沒有反射需要=)

*或抽象類..真的,無論什麼最合適!