如何创建接收类型的通用工厂?

时间:2016-11-30 20:16:16

标签: c# generics

我正在尝试创建一个工厂方法(它实际上是轮询一个远程服务),它接受类型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#做什么(我只是有语法或设计问题),或者我是否尝试做一些语言不支持的事情?

0 个答案:

没有答案