您好,我正在尝试在 C# 接口(interface)中实现泛型。我有一种方法,在实现泛型后应该采用不同的模型作为参数。下面是我的界面。
public interface IKafkaProducer<T>
{
Task ProduceAsync(T kafkaEvent, string topicName);
}
实现泛型后,这个 Kafka 事件可能应该是不同的模型。例如,它应该能够采用 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;
}
}
上面代码中 private readonly IKafkaProducer kafkaProducer;也给我错误使用通用类型 IKafkaProducer 需要一个参数。 有人可以帮我解决这个问题吗?任何帮助,将不胜感激。谢谢
最佳答案
更改此行:
private readonly IKafkaProducer kafkaProducer;
至
private readonly IKafkaProducer<ProductRangeEvent> kafkaProducer;
关于c# - 如何在C#接口(interface)中实现泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56783448/