Я хочу, чтобы вложенный класс Generic в другом классе Generic определялся автоматически. Можно ли это сделать, и если да, то как?

Для примера у меня есть базовый класс:

public abstract class BaseModel<TId> : IBaseModel<TId> where TId: struct
{
    public abstract TId Id { get; set; }

    [JsonIgnore]
    public abstract string Path { get; set; }

    public string ToJson() => 
        JsonConvert.SerializeObject(this);
}

И так, мы наследуем этот класс для другого, чтобы иметь определенные поля, когда мы используем его в методе. Пример метода ниже.

public class TestModel : BaseModel<int>
{
    public override int Id { get; set; }

    public override string Path { get; set; } = "";


    // You can add your own fields to the model
    public string Value { get; set; }
}

Теперь я хочу, чтобы для каждого класса (только тех, которые унаследованы от BaseModel) работал статический метод расширения:

public static async Task<TObj> PutAsync<TObj, TId>(this TObj obj, string apiUrl) where TObj : BaseModel<TId> where TId : struct
        {
            using var client = new HttpClient();
            using var request = new HttpRequestMessage
            {
                Method = HttpMethod.Put,
                RequestUri = new($"{apiUrl}{obj.Path}/{obj.Id}"),
                Content =
                    new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
            };
            var response = await client.SendAsync(request);
            return JsonConvert.DeserializeObject<TObj>(response.Content.ReadAsStringAsync().Result) ??
                   default!;
        }

Теперь к делу, если я хочу вызвать этот метод для экземпляра класса, унаследованного от BaseModel, я делаю следующее:

var testModel = new TestModel();
await testModel.PutAsync<TestModel, int>("Tests");

Суть проблемы в том, что я не хочу указывать типы TObj и TId каждый раз, когда я вызываю метод. Например, следующий код будет жаловаться на неопределенный тип в методе:

var testModel = new TestModel();
await testModel.PutAsync("Tests");

Ответы (0 шт):