Я хочу, чтобы вложенный класс 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");