我可以在这里使用什么来模拟?(通配符)C#中的泛型?
我有以下代码:我可以在这里使用什么来模拟?(通配符)C#中的泛型?,c#,generics,wildcard,C#,Generics,Wildcard,我有以下代码: using System; using System.Collections.Generic; using SpiShared; namespace SpiController.Queue { public class FakeQueueService : IQueueService { public FakeQueueService() { this.MessagesDeleted = new List
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()
设置为非泛型),或者将非泛型基接口添加到QueueMessage
并存储该接口。您不能这样做
相反,您可以将整个类设置为泛型(并将
Delete()
设置为非泛型),或者将非泛型基接口添加到QueueMessage
并将其存储。由于您添加了QueueMessage,在我看来,您可以基于
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);
}
}
}
namespace-SpiController.Queue
{
公共类FakeQueueService:IQueueService
{
公共伪造排队服务()
{
this.MessagesDeleted=新列表();
}
公共IList消息已删除{
得到;
私人设置;
}
公共无效删除(队列消息)
{
this.messages删除.Add(message);
}
}
}
更新:
真正的问题是为什么QueueMessage是强类型类。通常,这是因为您确实知道要在某个队列中放置哪些消息(例如,某个特定队列始终包含包含发票的消息)
如果不想跟踪消息的类型,则只需使用QueueMessage类。例如,如果我查看azure中使用的QueueMessage类,则有一个非通用版本可用。
由于您添加了一条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);
}
}
}
namespace-SpiController.Queue
{
公共类FakeQueueService:IQueueService
{
公共伪造排队服务()
{
this.MessagesDeleted=新列表();
}
公共IList消息已删除{
得到;
私人设置;
}
公共无效删除(队列消息)
{
this.messages删除.Add(message);
}
}
}
更新:
真正的问题是为什么QueueMessage是强类型类。通常,这是因为您确实知道要在某个队列中放置哪些消息(例如,某个特定队列始终包含包含发票的消息)
如果不想跟踪消息的类型,则只需使用QueueMessage类。例如,如果我查看azure中使用的QueueMessage类,则有一个非通用版本可用。
正如其他人所建议的,您可以在任何地方使用“T”。或者,如果您确实希望一个列表包含所有类型,您可以将“?”设为“对象”,这将允许有效地将任何类型存储在该列表中,并在以后强制转换它。这在.net库中非常常见 或者,如前所述,在任何地方使用“T”(即使整个类成为泛型),但确定T应该来自的某个接口,如下所示:
public class FakeQueueService<T> : IQueueService where T: ISomeInterface
public类FakeQueueService:IQueueService其中T:i接口
正如其他人所建议的,您可以在任何地方使用“T”。或者,如果您确实希望一个列表包含所有类型,您可以将“?”设为“对象”,这将允许有效地将任何类型存储在该列表中,并在以后强制转换它。这在.net库中非常常见
或者,如前所述,在任何地方使用“T”(即使整个类成为泛型),但确定T应该来自的某个接口,如下所示:
public class FakeQueueService<T> : IQueueService where T: ISomeInterface
public类FakeQueueService:IQueueService其中T:i接口
如何使Delete非泛型是QueueMessage是泛型的,是一个类?如何使Delete非泛型是QueueMessage是泛型的,是一个类?我不能,t
可以是任何东西,我不在乎它是什么,这就是问题所在。在java中,我可以直接使用它吗?QueueMessage是强类型的,因为它必须是强类型的,在某些情况下,知道我有什么类型的消息是有意义的,而在其他情况下,比如Delete
情况,它没有。使用强类型IQueueService接口是没有意义的,因为它会生成许多消息,实际的接口是:我不能,t
可以是任何东西,我不在乎它是什么,这就是问题所在。在java中,我可以直接使用它吗?QueueMessage是强类型的,因为它必须是强类型的,在某些情况下,知道我有什么类型的消息是有意义的,而在其他情况下,比如Delete
情况,它没有。使用强类型IQueueService接口没有意义,因为它会生成许多消息,实际接口是: