如何将接口类型对象添加到列表中接口类型具有通用类型的列表
如何将接口添加到列表接口类型具有通用类型的位置?
相同的代码段,
namespace MyNamespace
{
public interface ITest<TMessageKey, TEventMessage, TProducerSetting, TProducerClient>
{
Task ProcesMessage(Func<TMessageKey, TEventMessage, TProducerSetting, IResult<TEventMessage>> message);
}
public class Test<TMessageKey, TEventMessage, TProducerSetting, TProducerClient> : ITest<TMessageKey, TEventMessage, TProducerSetting, TProducerClient>
{
public async Task ProcesMessage(Func<TMessageKey, TEventMessage, TProducerSetting, IResult<TEventMessage>> message)
{
Console.WriteLine("Processed...");
}
}
public interface IResult<TEventMessage>
{
TEventMessage ProcessedMessage { get; set; }
bool Status { get; set; }
}
public class Result<TEventMessage> : IResult<TEventMessage>
{
public TEventMessage ProcessedMessage { get; set; }
public bool Status { get; set; }
}
public interface IType { }
public class Message { }
public class Message1 : Message { }
public class Message2 : Message { }
public class Message3 : Message { }
public class TestProducerSetting { }
public class SomeClient { }
public class Execute
{
private List<ITest<string, Message, TestProducerSetting, SomeClient>> lst = new();
public void TestMethod()
{
ITest<string, Message1, TestProducerSetting, SomeClient> test1 = new Test<string, Message1, TestProducerSetting, SomeClient>();
ITest<string, Message2, TestProducerSetting, SomeClient> test2 = new Test<string, Message2, TestProducerSetting, SomeClient>();
ITest<string, Message3, TestProducerSetting, SomeClient> test3 = new Test<string, Message3, TestProducerSetting, SomeClient>();
var res1 = test1.ProcesMessage(Method1);
var res2 = test2.ProcesMessage(Method2);
var res3 = test3.ProcesMessage(Method3);
//Compile time error comes here
lst.Add(test1);
lst.Add(test2);
lst.Add(test3);
}
private IResult<Message1> Method1(string messageKey, Message1 message, TestProducerSetting setting)
{
return new Result<Message1> { ProcessedMessage = message, Status = true };
}
private IResult<Message2> Method2(string messageKey, Message2 message, TestProducerSetting setting)
{
return new Result<Message2> { ProcessedMessage = message, Status = true };
}
private IResult<Message3> Method3(string messageKey, Message3 message, TestProducerSetting setting)
{
return new Result<Message3> { ProcessedMessage = message, Status = true };
}
}
}
以下是实时 test1
,test2
和test3
对象是在循环中创建的。
请注意,“ ProcesMessage”采用了输入的功能输入,其中teventMessage在输入中以及返回类型的一部分。我无法使用协方差和违反能力来实现这一目标。
请注意,仅对于我手动创建对象的查询。 可以解决吗?
How to add an Interface to list where Interface type has Generic types?
Below are the code snippet for the same
namespace MyNamespace
{
public interface ITest<TMessageKey, TEventMessage, TProducerSetting, TProducerClient>
{
Task ProcesMessage(Func<TMessageKey, TEventMessage, TProducerSetting, IResult<TEventMessage>> message);
}
public class Test<TMessageKey, TEventMessage, TProducerSetting, TProducerClient> : ITest<TMessageKey, TEventMessage, TProducerSetting, TProducerClient>
{
public async Task ProcesMessage(Func<TMessageKey, TEventMessage, TProducerSetting, IResult<TEventMessage>> message)
{
Console.WriteLine("Processed...");
}
}
public interface IResult<TEventMessage>
{
TEventMessage ProcessedMessage { get; set; }
bool Status { get; set; }
}
public class Result<TEventMessage> : IResult<TEventMessage>
{
public TEventMessage ProcessedMessage { get; set; }
public bool Status { get; set; }
}
public interface IType { }
public class Message { }
public class Message1 : Message { }
public class Message2 : Message { }
public class Message3 : Message { }
public class TestProducerSetting { }
public class SomeClient { }
public class Execute
{
private List<ITest<string, Message, TestProducerSetting, SomeClient>> lst = new();
public void TestMethod()
{
ITest<string, Message1, TestProducerSetting, SomeClient> test1 = new Test<string, Message1, TestProducerSetting, SomeClient>();
ITest<string, Message2, TestProducerSetting, SomeClient> test2 = new Test<string, Message2, TestProducerSetting, SomeClient>();
ITest<string, Message3, TestProducerSetting, SomeClient> test3 = new Test<string, Message3, TestProducerSetting, SomeClient>();
var res1 = test1.ProcesMessage(Method1);
var res2 = test2.ProcesMessage(Method2);
var res3 = test3.ProcesMessage(Method3);
//Compile time error comes here
lst.Add(test1);
lst.Add(test2);
lst.Add(test3);
}
private IResult<Message1> Method1(string messageKey, Message1 message, TestProducerSetting setting)
{
return new Result<Message1> { ProcessedMessage = message, Status = true };
}
private IResult<Message2> Method2(string messageKey, Message2 message, TestProducerSetting setting)
{
return new Result<Message2> { ProcessedMessage = message, Status = true };
}
private IResult<Message3> Method3(string messageKey, Message3 message, TestProducerSetting setting)
{
return new Result<Message3> { ProcessedMessage = message, Status = true };
}
}
}
In real time the test1
, test2
and test3
objects are created in the loop.
Note that "ProcesMessage" takes the Func input where TEventMessage in input as well as part of the return type as well. I was not able to achieve this using covariance and contravariance.
Please note that, just for the queries I created the object manually.
Is it possible to resolve it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论