我坚持认为自己可以轻松实现的目标,但似乎无法实现。问题如下:
我有一个包含接口属性(“ 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/