Делегирование вызова метода C # - PullRequest
0 голосов
/ 17 января 2009

Скажем, у меня есть сборка DLL, содержащая автоматически сгенерированный класс с двумя методами:

public class AutoGeneratedClass
{
    public int DoSomething(bool forReal) { ??? }
    public void DoSomethingElse(string whatever) { ??? }
}

Методы могут быть любыми, правда. Выше приведена только иллюстрация.

Какой код мне нужно генерировать вместо ??? выше, чтобы он автоматически упаковывал параметры вызова и отправлял их одному универсальному методу другого класса, который затем фактически обрабатывал бы вызов и возвращал результат?

public class GenericClass
{
    public ??? GenericHandler(???) { ??? }
}

Полагаю, я ищу что-то, что работает как Expression<Func<...>> в LINQ, которое компилируется в структуру данных, которую можно отправлять куда угодно и разбирать там.

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

Если это не может быть достигнуто, каковы мои варианты?

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 января 2009

У тебя должен быть класс? С интерфейсами жизнь была бы намного проще - тогда вы можете использовать System.Runtime.Remoting.Proxies.RealProxy или, возможно, создать новый тип по требованию. Я полагаю, что Rhino.Mocks выполняет последнее (используя библиотеку для выполнения тяжелой работы) - и если вы можете использовать интерфейс, посмотреть, как реализован Rhino.Mocks, вполне может хорошая отправная точка.

0 голосов
/ 17 января 2009

Я собираюсь сделать удар в темноте здесь, так как я не уверен, каковы все ваши ограничения. Это звучит как хороший пример для частичных методов / частичного класса для вашего класса AutoGenerated. (Обратите внимание, что я не запускал этот продукт через компилятор, поэтому он, вероятно, нуждается в некоторой очистке.)

public partial class AutoGenerated
{
    public partial int ProcessDoSomething(bool forReal);
    public int DoSomething(bool forReal)
    {
        //some generated code against error conditions??
        return ProcessDoSomething(forReal)
    }

    .....
}

public partial class AutoGenerated
{
    public partial int ProcessDoSomething(bool forReal)
    {
        //call the generic handler...
    }
}

Я собираюсь держаться подальше от LINQ-подобной части выражений универсального обработчика, так как я все еще работаю над гроккинговыми выражениями. Однако следует учитывать, насколько сложно / легко будет поддерживать ваш GenericClass, если вы пойдете по пути выражения, подобному LINQ?

Мой опыт показывает, что многим разработчикам не нравятся делегаты и выражения lamba. Они съеживаются (буквально), когда смотрят на код, который использует выражения.

...