c# - 在构造函数中将泛型转换为接口(interface)

标签 c# generics

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

  1. 我有一个包含接口(interface)属性(“IPayload”)的类(“Response”),该类也在构造函数中接受该接口(interface)属性。

  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;
        }
    }
    

最佳答案

如果响应的消费者不关心具体类型,我建议你使用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/

相关文章:

java - 如何获取传递的集合<通用类型>的子集合,其中成员扩展或实现另一个集合?

java - 泛型 - 函数返回类型与参数类型相同?

c# - 为什么要使用泛型和非泛型函数变体?

java - Java 中的接口(interface)问题

c# - 在字符串末尾找到匹配项时,使用 .Contains() 和 .ToLowerInvariant() 的 EF 查询结果没有匹配项

c# - 如何在C#程序中使用用Visual C++编写的DLL?

c# - 将 Func 传递给 Linq to Entities Sum(..)

c# - Nant:如何构造 svn:externals 以构建引用第 3 方 dll 的类库

c# - 是否可以使用源代码生成器来处理异常?

java - ArrayList<T> 与 ArrayList<?>