我坚持认为自己可以轻松实现的目标,但似乎无法实现。问题如下:


我有一个包含接口属性(“ IPayload”)的类(“ Response”),该属性也接受构造函数中的该接口属性。
我还有另一个类,其中包含执行工作并创建Response实例的方法。它接受一个约束为IPayload的类型参数,并创建一个List实例(同样,T约束为IPayload),尝试将其添加到响应中。
当我尝试实现构造函数时,似乎无法将泛型对象从helper方法转换为可接受的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;
    }
}

最佳答案

如果响应的使用者不关心具体类型,建议您使用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;
}

关于c# - 在构造函数中将泛型转换为接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50710952/

10-10 18:49