Вопрос

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

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

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

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

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

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

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

Если это невозможно, каковы мои варианты?

Спасибо!

Это было полезно?

Решение

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

Другие советы

Я собираюсь сделать здесь удар в темноте, так как я не уверен, каковы все ваши ограничения. Это звучит как хороший пример для частичных методов / частичного класса для вашего класса 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. Они съеживаются (буквально), когда смотрят на код, который использует выражения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top