0

我一直在寻找一段时间,看看是否有人试图做一些接近这个的事情,我发现有一群人试图与一个通用类型的列表进行交互。相反,我需要与一般类型的复杂对象列表进行交互。这是当前代码。

public class RequestBundleItem<T> where T : BaseJsonResponseMessage
{
    public T Response { get; private set; }

    //intializers - code not needed

    public void SetResponse(String jsonResponse)
    {
        Response = (T)jsonResponse.JsonToObject<T>();
    }
}

public class RequestBundleManager
{
    private List<RequestBundleItem<T>> BundleItems;

    public async Task<List<RequestBundleItem<T>>> ProcessItemsAsync()
    {
        List<Task<JsonValueEventArgs>> tasks = //create tasks from bundleitems;

        for (var i = 0; i < tasks.Count(); i++)
        {
            Task<JsonValueEventArgs> curTask = tasks[i];
            var args = await curTask;

            BundleItems[i].SetResponse(args.ValueAsText);

        }

        return BundleItems;
    }

    public void AddItem<T>(RequestBundleItem<T> newItem) where T : BaseJsonResponseMessage
    {
        BundleItems.Add(newItem);
    }
}

这条线是导致问题的原因

private List<RequestBundleItem<T>> BundleItems;

我不知道如何定义这个列表,因为 T 是通用的,只需要实现 BaseJsonResponseMessage 但我不想输入 RequestBundleManager 本身。

解决方案:

我最终从 RequestBundleItem 中删除了泛型,消费者负责了解它需要返回的响应类型。

4

2 回答 2

1

也使RequestBundleManager通用:

public class RequestBundleManager<T>

现在你的 list 可以用 type 来定义T。当然,你必须确保T你在创建时使用的和你RequestBundleManger使用的相同RequestBundleItem,并且你的列表是同质的。

如果您希望RequestBundleManager使用混合处理列表T,那么您将需要RequestBundleItem从基类派生或让它实现接口。

于 2013-11-08T18:53:55.527 回答
1

像这样定义列表RequestBundleManager

private List<RequestBundleItem<BaseJsonResponseMessage>>

如果你不把类型放在 上RequestBundleManager,你不知道列表中对象的具体类型,除了它是一个BaseJsonResponseMessage. 然后像这样定义它是有意义的。它只会让您访问BaseJsonResponseMessage尽管定义的方法。

如果这还不够,请考虑在 in 中定义一个包含您想要访问的所有方法的接口,RequestBundleManager并将其作为对 in 类型的约束RequestBundleItem。像这样的东西:

public class RequestBundleItem<T> where T : BaseJsonResponseMessage, IMyInterface

然后像这样定义列表RequestBundleManager

private List<RequestBundleItem<IMyInterface>>
于 2013-11-08T18:55:58.087 回答