我有以下代码:
using System;
using System.Collections.Generic;
using SpiShared;
namespace SpiController.Queue
{
public class FakeQueueService : IQueueService
{
public FakeQueueService()
{
this.MessagesDeleted = new List<QueueMessage<?>>();
}
public IList<QueueMessage<?>> MessagesDeleted {
get;
private set;
}
public void Delete<T>(QueueMessage<T> message)
{
this.MessagesDeleted.Add(message); // doesn't work
}
}
}
在Delete
我实际上并不关心T
是什么,我所关心的是我想要存储所提供的message
对象。我如何使用泛型来做到这一点?这甚至可能吗?
实际的IQueueService
界面是:
using System;
using SpiShared;
namespace SpiController.Queue
{
public interface IQueueService
{
Option<QueueMessage<T>> Poll<T>(Func<string,T> parser);
void Push(string queueUrl, string message);
void Delete<T>(QueueMessage<T> message);
}
}
答案 0 :(得分:4)
你不能。
相反,您可以将整个类设为通用(并使Delete()
非泛型),或者将非通用基本接口添加到QueueMessage
并存储它。
答案 1 :(得分:4)
因为你添加了一个QueueMessage,在我看来你可以根据T
让你的整个类变得通用namespace SpiController.Queue
{
public class FakeQueueService<T> : IQueueService
{
public FakeQueueService()
{
this.MessagesDeleted = new List<QueueMessage<T>>();
}
public IList<QueueMessage<T>> MessagesDeleted {
get;
private set;
}
public void Delete(QueueMessage<T> message)
{
this.MessagesDeleted.Add(message);
}
}
}
更新: 真正的问题是为什么QueueMessage是一个强类型的类。通常是因为您确实知道要将某些消息放在某个队列上(假设特定队列始终包含包含发票的消息)
如果您不想跟踪消息类型,那么只需使用QueueMessage类。例如,如果我查看azure中使用的QueueMessage类,则可以使用非泛型版本。 https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.queue.protocol.queuemessage.aspx
答案 2 :(得分:0)
正如其他人所说,你可以随处使用“T”。或者,如果您真的想要一个包含所有类型的列表,您可以制作“?”是“对象”这将有效地允许任何类型存储在那里,并在以后投射它。这在.net库中很常见。
或者,如前所述,在任何地方使用“T”(IE使整个类通用)但是决定T应该来自的某个接口,如下所示:
public class FakeQueueService<T> : IQueueService where T: ISomeInterface