Генерация синхронных extensions с помощью Roslyn

231
08 февраля 2018, 14:14

Привет. Предположим, есть какой-то интерфейс IInterface. Выглядит он примерно так:

public interface IInterface
{
    ISubInterface<MyClass> SubInterface { get; }
    ISubInterface<MyClass2> SubInterface2 { get; }
    ISecondSubInterface<MyClass> SecondSubInterface { get; }
}

В свою очередь, ISubInterface<T> выглядит примерно так (ISecondSubInterface<T> выглядит так же, не суть):

public interface ISubInterface<T> where T : class
{
    Task<Result<T>> GetAsync(string arg1, TimeSpan? timeout = null);
}

Хотелось бы кодогенерацией решить следующую задачу:
1) Получить все интерфейсы, которые являются типами свойств в IInterface
2) Сгенерировать для них класс с синхронными extensions вида:

public static SubInterfaceExtensions
{        
    public static Result<T> Get<T>(this ISubInterface<T> i, string arg1, TimeSpan? timeout = null)
    {
        return i.GetAsync(arg1, timeout).GetAwaiter().GetResult();
    }
}

Задача кажется не сложной, разбивается на подзадачи: 1) Найти все интерфейсы из IInterface
2) Получить полную информацию о сигнатурах методов, причём в IInterface они закрытые generics, а информация нужна еще о незакрытом
3) На основе полученных сигнатур построить новые методы-расширения и засунуть их в соотв. класс

Насколько для этих задач подходит Roslyn и если подходит, то как примерно это всё может выглядеть?

READ ALSO
C# для Unity.Изучение [требует правки]

C# для Unity.Изучение [требует правки]

Как изучить С# для Unity?Я думаю что есть разница между обычным си шарпом и для Unity

174
Signed Int32 из двух байт

Signed Int32 из двух байт

Есть строка из Java приложения, которая формирует signed INT из двух байт массива:

178
Преобразование из long [требует правки]

Преобразование из long [требует правки]

Возникла ошибка в программе, прошу разобратьсяВот скриншоты ошибки и ее места в коде:

176
Как запустить Unirest на с#

Как запустить Unirest на с#

Пытаюсь подключить либу Unirest я понимаю что здесь все написано http://unirestio/net но не могу понять что надо вписать и как создать MyClass

258