在构造函数

时间:2018-06-06 01:12:11

标签: c# generics

我坚持我认为容易做到的事情,但我似乎无法使其发挥作用。问题如下:

  1. 我有一个类(" Response"),它包含一个接口属性(" IPayload"),它也接受构造函数中的接口属性。

  2. 我有另一个类,它包含一个执行工作的方法并创建一个Response实例。它接受一个约束到IPayload的类型参数,并创建一个List实例(再次,其中T被约束为IPayload),它试图添加到响应中。

  3. 当我尝试实现构造函数时,我似乎无法将辅助方法中的泛型对象强制转换为可接受的IPayload实例以与构造函数一起使用。我认为我可以使用类似(T)之类的东西(typeof(T)),但我得到编译错误。我认为这应该是可行的买或许不是吗?思想赞赏。以下简化代码。

    public interface IPayload
    {
        // deliberately generic
    }
    
    public class Response
    {
        public Response(IEnumerable<IPayload> payload) => Payload = payload;
        public IEnumerable<IPayload> Payload { get; set; }
    }
    public class Worker
    {
    
        public Response DoWork<T>() where T : IPayload, new()
        {
            List<T> payload = new List<T>();
    
            // do stuff to construct payload
            // This throws a compile error: cannot convert from 'System.Collections.Generic.List<T>' to 'System.Collections.Generic.IEnumerable<Interfaces.IPayload>'
            Response response = new Response(payload);
    
            return response;
        }
    }
    

2 个答案:

答案 0 :(得分:1)

如果回复的消费者不关心具体类型,建议您使用List<IPayload>代替List<T>。这解决了编译错误。当然,只要它实现IPayload,您就可以将任何对象添加到列表中,因此如果需要,您仍然可以添加new T()

public Response DoWork<T>() where T : IPayload, new()
{
    IEnumerable<IPayload> payload = new List<IPayload>() { new T () };
    Response response = new Response(payload);
    return response;
}

答案 1 :(得分:0)

只需将class添加到where子句。

public Response DoWork<T>() where T : class, IPayload, new()