我正在尝试创建一个工厂方法(它实际上是轮询一个远程服务),它接受类型T
的泛型,它是IMessage
类型的接口并返回一个{ {1}}。因此代码看起来像:
List<IMessage>
不幸的是,当我尝试创建新客户端时遇到问题:
public class Client<T> : IClient where T: Type, IMessage
{
public Client(IExternalClient client, string url)
{
this.client = client;
this.queueUrl = queueUrl;
}
public List<IMessage> GetNextMessage()
{
var message = new Message();
return (T)Activator.CreateInstance(typeof(T), message);
}
}
给我错误
BarMessage类型不能用作类型参数'T' 通用类型或方法'客户'。没有隐含的参考 从'BarMessage'转换为'System.Type'
如果我将我的班级声明修改为:
var Foo = new Client<BarMessage>(new ExternalClient(), url);
然后直接调用构造函数编译。但是,当我传递public class Client<T> : IClient where T: IMessage
类型而不是IMessage
的实例时,我的工厂方法会崩溃。
IMessage
当我打电话给我的工厂方法时:
public class ClientFactory : Dictionary<string, Func<IClient>>, IClientFactory
{
public IClient CreateNew<T>(KeyValuePair<T, string> urlInfo) where T : IMessage
{
return new Client<T>(new ExternalClient(), urlInfo.Value);
}
}
其中urlInfo是包含Type和URL的clientFactory.CreateNew(urlInfo)
(除了创建我的客户端的外部客户端之外,还需要两条信息)我得到编译时错误
类型'System.Type'不能在泛型类型或方法中用作参数'T' IClientFactory.CreateNew)”。没有隐含的参考 从'System.Type'转换为'IMessage'。
我有一种感觉,我正在碰到协方差问题,但如果是这样,我就不知道诊断它了。我正在尝试用C#做什么(我只是有语法或设计问题),或者我是否尝试做一些语言不支持的事情?