C#C
C#16mo ago
kalten

Support generic method NativeAOT JsonTypedInfo all together

Hello, I'm in the process of rewriting some of my libs to support native aot.
But I have one use case for which I don't know how to do it.

My use case look like this:

public interface IMyService
{
    T Get<T>();
}
public class MyService(bool useV1) : IMyService
{
    public T Get<T>()
    {
        return useV1
            ? GetA<T>()
            : GetB<T>();
    }

    private T GetA<T>()
    {
        string json = "{\"Data\": {\"Name\":\"Hello\", \"Id\":1 }}";
        return JsonSerializer.Deserialize<ModelA<T>>(json).Data;
    }

    private T GetB<T>()
    {
        string json = "{\"Data\": {\"Name\":\"World\", \"Id\":2 }}";
        return JsonSerializer.Deserialize<ModelB<T>>(json).Data;
    }
}

public class ModelA<T>
{
    public T Data { get; set; }
}
public class ModelB<T>
{
    public T Data { get; set; }
}


The issue is that JsonSerializer.Deserialize need either a JsonTypeInfo or a JsonSerializerOptions with TypeInfoResolver property set, to be working in NativeAot mode.

But I don't know how to change IMyService without having to ask the user to provide two JsonTypeInfo parameters (One for ModelA<CustomData> and one for ModelB<CustiomData>)

And using a JsonSerializerOptions would make the api less intuitive.

Is there a way to JsonSourceGen only ModelA<> and ModelB<> in the lib and le the user provide the the T part?

Any advice is welcome.
Was this page helpful?