Создание свободного метода API, который принимает группу методов - PullRequest
2 голосов
/ 27 декабря 2011

Я пытаюсь создать свободный стиль API, который принимает указание метода.То, чего я хочу достичь, можно описать с помощью этого (недопустимого) примера кода:

public class SampleBuilder
{
    public void Method<T>(Expression<Func<T, Delegate>> func) { }
    // for the sake of this example this method doesn't have a return value
}

public class Sample
{
    public void SomeMethod(int some, int arbitrary, int agruments) { }
}

public class SampleConfig
{
    public void Config()
    {
        new SampleBuilder().Method<Sample>(x => x.SomeMethod);
    }
}

Проблема в том, что компилятор явно жалуется, что x.SomeMethod обозначает группу методов.Мой API не может предполагать ни фактический экземпляр, ни фактическую сигнатуру метода.Это должно быть решено во время выполнения.

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


Справочная информация:результирующее использование будет выглядеть следующим образом:

config.Transition().From(v1def, v1 => v1.ExitMethod).To(v2def, v2 => v2.EntryMethod);

Где To() и From() принимают определения представлений и их вход / выход методы.В приведенном выше примере v1def обозначает класс определения представления, а v1 обозначает действительный класс представления.В конце дня новый переход создается и добавляется в config.

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

К сожалению, просто невозможно передать группу методов в качестве параметра. Насколько мне известно, CLR (а также различные языки и все, что между ними) запрещает передавать то, что по сути было бы нетипизированным делегатом ... и из-за перегрузки методов сценарий нескольких делегатов с разными сигнатурами был представленный именем группы методов, должен быть рассмотрен.

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

Если ваша архитектура не поддается расширению с помощью AOP, единственный оставшийся вариант - использовать решение со слабой типизацией, использующее строки при записи конфигурации, и обильные объемы отражения при чтении этих строк назад. , Я знаю, что это не похоже на большинство других свободно распространяемых API в .NET, но действительно ли это так плохо?

config.Transition().From(v1def, "ExitMethod").To(v2def, "EntryMethod");
0 голосов
/ 27 декабря 2011

Один из способов - добавить

public void SomeMethod() { }

в классе Sample и измените подпись SampleBuilder.Method на

public void Method<T>(Expression<Func<T, Action>> func) { }

Таким образом, вы можете захватить имя нужного метода (передав группу методов, которая преобразуется в экземпляр делегата) и выбрать правильную перегрузку.

...