与一般类型的复杂对象列表交互

时间:2013-11-08 18:46:13

标签: c# generics

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

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中删除了泛型,并且消费者负责知道它需要的响应类型。

2 个答案:

答案 0 :(得分:1)

同时使RequestBundleManager通用:

public class RequestBundleManager<T>

现在您可以使用T类型定义列表。当然,您必须确保在创建T时使用的RequestBundleManger与您用于RequestBundleItem的{​​{1}}相同,并且您的列表将是同质的。

如果您希望RequestBundleManager处理混合T的列表,那么您需要从基类派生RequestBundleItem,否则让它实现一个接口。

答案 1 :(得分:1)

RequestBundleManager中定义列表,如下所示:

private List<RequestBundleItem<BaseJsonResponseMessage>>

如果您没有在RequestBundleManager上添加类型,则除了它是BaseJsonResponseMessage之外,您不知道列表中对象的特定类型。那么就像这样定义它是有意义的。它只允许您访问BaseJsonResponseMessage中定义的方法。

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

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

然后在RequestBundleManager中定义列表,如:

private List<RequestBundleItem<IMyInterface>>