Динамически изменять шаблон Resharper на основе данных контекстного типа - PullRequest
0 голосов
/ 15 февраля 2019

Используя шаблоны Resharper, я хотел бы динамически корректировать результирующий код на основе данных контекстного типа, доступных из статического анализа при заполнении шаблона.

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

Вот (подробный) пример того, чего я пытаюсь достичь:


/* template */
return _service.MakeCall(
    client => client.$methodName$(),
    returnValue => returnValue.$transformMethod$());


/* class being written with the assistance of the template */
class FooDataAccess
{
    ServiceHelper<FooServiceClient> _service;

    public Foo GetFoo(int id)
    {
        /* template usage, the type returned by GetFoo() does not result is any
        additional transformation */
        return _service.MakeCall(
            client => client.GetFoo(),
            returnValue => returnValue.ToDomain());
    }

    public IEnumerable<Foo> GetFoos()
    {
        /* template usage, $transformMethod$ is wrapped in a Select method since
        GetFoo() returns an IEnumerable */
        return _service.MakeCall(
            client => client.GetFoo(),
            returnValue => returnValue.Select(p => p.ToDomain()));
    }
}

/* supporting classes */
class ServiceHelper<TClient>
{
    public TOutput MakeCall<TResult, TOutput>(Func<TClient, TResult> call, Func<TResult, TOutput> transform)
    { ... }
}

class FooServiceClient
{
    public FooData GetFoo(int id)
    { /* make service call */ }

    public IEnumerable<FooData> GetFoos()
    { /* make service call */ }
}

static class FooExtensions
{
    public static Foo ToDomain(this FooData data)
    { /* hydrate domain from data */ }

    public static FooData ToData(this Foo domain)
    { /* hydrate data from domain */ }  
}
...