我一直在寻找一段时间,看看是否有人试图做一些接近这个的事情,我发现有很多人试图与一般类型的列表进行交互。我需要与通常键入的复杂对象列表进行交互。这是当前的代码。
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中删除了泛型,并且消费者负责知道它需要的响应类型。
答案 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>>