Оболочка Graphql с внешними интерфейсами, сгенерированными lib, выдает: Ошибка CS0030 Не удалось преобразовать тип «к TResult» - PullRequest
0 голосов
/ 06 апреля 2020

Я использую эту библиотеку для генерации клиента и некоторого интерфейса для моей схемы graphql: https://github.com/lukemurray/DotNetGraphQLQueryGen

Мой код выглядит примерно так:

public abstract class MutationBase
{
    public Task<GqlResult<TResult>> RunQueryAsync<TResult>()
    {
        // some stuff
        return RunQueryAsyncInternal<TResult>();
    }
    protected abstract Task<GqlResult<TResult>> RunQueryAsyncInternal<TResult>();
}

public class SomeMutationWrapper : MutationBase
{
    protected override Task<GqlResult<TResult>> RunQueryAsyncInternal<TResult>()
    {
        return _client.MutateAsync(
            m => m.SomeMutation(
                    param1, param2,
                    s => (TResult)new { s.Id, s.Name }
            )
        );
    }
}

Генерируемый интерфейс выглядит примерно так:

public interface Mutation
{
    [GqlFieldName("someMutation")]
    TReturn SomeMutation<TReturn>(string param1, string param2, Expression<Func<SomeMutationsReturnType, TReturn>> selection);
}
public interface SomeMutationsReturnType
{
    [GqlFieldName("id")] int Id { get; }
    [GqlFieldName("name")] string Name { get; }
}

И я тоже хочу назвать это так:

public class ConsumerClass
{
    public async void Consume()
    {
        SomeMutationWrapper wrapper = new SomeMutationWrapper();
        var resp = wrapper.RunQueryAsync<SomeMutationsReturnType>();
        Console.WriteLine($"Id: {resp.Data.Id} | Name: {resp.Data.Name}");
    }
}

Проблема в реализации RunQueryAsyncInternal в части выбора лямбды: s => (TResult)new { s.Id, s.Name }

Это дает мне ошибку в заголовке.

Error CS0030 Cannot convert type '<anonymous type: int Id, string Name>' to 'TResult'

Как я могу устранить эту ошибку преобразования (без изменения сгенерированного кода клиента или интерфейса)

...