Привет, я пытаюсь реализовать Generics в C # интерфейсах.У меня есть один метод, который должен принимать различные модели в качестве параметров после реализации Generics.Ниже приведен мой интерфейс.
public interface IKafkaProducer<T>
{
Task ProduceAsync(T kafkaEvent, string topicName);
}
Это событие Кафки может быть различными моделями после реализации Generics.Например, он должен иметь возможность принимать класс Employee или User и т. Д. Ниже приведена реализация моего класса.
public class KafkaProducer<T> : IKafkaProducer<T>
{
public async Task ProduceAsync(T kafkaEvent, string topicName)
{
using (var schemaRegistry = new CachedSchemaRegistryClient(this.kafkaSchemaRegistryConfig.GetConfig()))
using (var producer =
new ProducerBuilder<string, ProductRangeEvent>(this.producerConfigFactory.ProducerConfig())
.SetKeySerializer(new AvroSerializer<string>(schemaRegistry))
.SetValueSerializer(new AvroSerializer<ProductRangeEvent>(schemaRegistry))
.Build())
{
Console.WriteLine($"{producer.Name} producing on {topicName}. Enter user names, q to exit.");
await producer
.ProduceAsync(topicName, new Message<string, ProductRangeEvent> { Key = null, Value = kafkaEvent })
.ContinueWith(task => task.IsFaulted
? $"error producing message: {task.Exception.Message}"
: $"produced to: {task.Result.TopicPartitionOffset}");
}
}
}
В приведенном выше коде ProduceAsync(topicName, new Message<string, ProductRangeEvent> { Key = null, Value = kafkaEvent })
value = kafkaEvent выдает ошибку.Этот kafkaEvent имеет тип ProductRangeEvent.Это дает мне ошибку, не может неявно преобразовать тип T в ProductRangeEvent.Я называю вышеуказанный метод как
public class TestController
{
private readonly IKafkaProducer kafkaProducer;
public TestController(IKafkaProducer kafkaProducer)
{
this.kafkaProducer = kafkaProducer;
}
[HttpGet]
[Route("/api/test")]
public IActionResult Test()
{
ProductRangeEvent productRangeEvent = new ProductRangeEvent
{
id = "101"
};
var response = this.kafkaProducer.ProduceAsync(productRangeEvent, "users");
response.Wait();
var hi = response.IsCompletedSuccessfully;
return null;
}
}
В приведенном выше коде приватный только для чтения IKafkaProducer kafkaProducer;также выдает ошибку Использование универсального типа IKafkaProducer требует одного аргумента.Может кто-нибудь помочь мне решить эту проблему?Любая помощь будет оценена.Спасибо