我坚持我认为容易做到的事情,但我似乎无法使其发挥作用。问题如下:
我有一个类(" Response"),它包含一个接口属性(" IPayload"),它也接受构造函数中的接口属性。
我有另一个类,它包含一个执行工作的方法并创建一个Response实例。它接受一个约束到IPayload的类型参数,并创建一个List实例(再次,其中T被约束为IPayload),它试图添加到响应中。
当我尝试实现构造函数时,我似乎无法将辅助方法中的泛型对象强制转换为可接受的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;
}
}
答案 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()