我可以在这里用什么来模拟? (通配符)C#中的泛型?

时间:2015-02-04 18:24:27

标签: c# generics wildcard

我有以下代码:

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);

    }
}

3 个答案:

答案 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