【问题标题】:PHP to ASP.NET - call_user_func() equivalent?PHP 到 ASP.NET - call_user_func() 等效?
【发布时间】:2010-09-28 15:19:30
【问题描述】:

我想知道在 ASP.NET 应用程序中是否有与 PHP 的 call_user_func() 等效的函数。我正在寻找从 PHP 应用程序到 ASP.NET 的转换,作为一种自学语言的方法,方法是使用我专业构建的 CMS 并尝试用其他语言重新创建它。

我需要一个与此类似的函数的原因是因为我的 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() 调用已被简化,因为我是从内存中编写的,但这就是它的要点。

【问题讨论】:

  • 您能向我们 ASP.NET 开发人员解释一下这个函数的作用吗?
  • 这会从给定名称中调用方法作为字符串。如果传入一个数组,第一个字符串是类,第二个是函数名。您还可以传入函数可以使用的任意数量的参数(我实际的 InvokeHook 方法使用这个)

标签: php asp.net web-applications


【解决方案1】:

在 .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

【讨论】:

    【解决方案2】:

    对于 .NET 开发人员来说,这基本上是一种从给定名称(作为字符串)调用方法的方法。

    致 OP:(我认为)您必须使用反射。它远没有那么漂亮而且相当昂贵(IIRC),所以最好不要过度使用。

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

    我认为,如果您不得不诉诸这种方式来完成工作,您可能会以“错误”的方式做事。可能有一种更简洁的模式会更好地工作。

    我制作插件架构的方式是通过全局共享接口*,因此插件可以实现“插件”接口*,然后我知道会有可用的 .DoSomething() (etc) 方法。无需反思 =)

    *或抽象类..真的,最合适的!

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多