我可以在这里使用什么来模拟?(通配符)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接口没有意义,因为它会生成许多消息,实际接口是: