PHP в ASP.NET - call_user_func () эквивалентно? - PullRequest
2 голосов
/ 28 декабря 2008

Мне интересно, есть ли в приложении 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 () упрощен, поскольку я пишу это из памяти, но в этом суть.

Ответы [ 2 ]

3 голосов
/ 29 декабря 2008

В .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 голосов
/ 28 декабря 2008

Для разработчиков .NET это в основном метод вызова метода с заданным именем (в виде строки).

К ОП: (Я думаю) Вы должны использовать отражение. Это далеко не так красиво и довольно дорого (IIRC), поэтому лучше его не использовать.

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

Я думаю, что вы, возможно, делаете вещи "неправильно", если вам приходится прибегать к этому, чтобы добиться цели. Возможно, будет более чистый шаблон, который будет работать лучше.

Способ создания плагин-архитектур заключается в использовании глобально разделяемых интерфейсов *, чтобы плагины могли реализовать интерфейс "плагинов" *, и тогда я знаю, что будет доступен метод .DoSomething () (и т. Д.) Отражение не требуется =)

* Или абстрактные классы .. Действительно, все, что подходит лучше всего!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...