富不能因为除了保持通用要求的集合通用的,它是独立完整的请求。有一个Foo实例(将其称为会话),但有几十种不同类型的请求。它并不关心一个请求是一个LoginRequest还是一个BuyMeRequest。但是,Request是通用的,因为我使用提供的Response类型来构造当前类型的Response对象,并将它从通过线路传入的数据反序列化。
那么你的收藏不应该是通用要么。您可能需要考虑放弃泛型定义并简单地使用继承。这应该让你在路上,虽然不是100%,但你的问题在用法上是模糊的。当然,这使用LINQ(我认为是3.5+或更高版本),它应该很容易迁移到2.0。
public class Foo
{
// initialize: best practice
private List<CacheRequest> _pendingRequests =
new List<CacheRequest>();
// upper case: best practice
public void AddRequest(int sequence, Request request)
{
if (request.Response == null)
{
throw new ArgumentException("Request Response cannot be null.");
}
_pendingRequests.Add(new CacheRequest()
{
Sequence = sequence,
Request = request,
ResponseType = request.Response.GetType()
});
}
public bool TryGetRequest<T>(int seq, out Request request, out T response)
where T : Request
{
response = null;
request = null;
var pendingRequest = _pendingRequests
.Where(cr => cr.ResponseType == typeof(T))
.FirstOrDefault(r => r.Sequence == seq);
var result = pendingRequest != null;
if (result)
{
request = pendingRequest.Request;
response = request.Response as T;
}
return result;
}
private class CacheRequest
{
public int Sequence { get; set; }
public Request Request { get; set; }
public Type ResponseType { get; set; }
}
}
public class Request
{
public Response Response { get; set; }
}
public abstract class Response { }
public class HttpResponse : Response { }
public class UdpResponse : Response { }
实施例:
var foo = new Foo();
foo.AddRequest(1, new Request() { Response = new HttpResponse() });
Request request;
HttpResponse httpResponse;
UdpResponse udpResponse;
if (foo.TryGetRequest<HttpResponse>(1, out request, out httpResponse))
{
Console.WriteLine("1 is an HttpResponse");
}
if (!foo.TryGetRequest<UdpResponse>(1, out request, out udpResponse))
{
Console.WriteLine("1 is not a UdpResponse");
}
输出:
1是一个HttpResponse
1不是UdpResponse
DotNetFiddle Example
你可以创建一个非泛型'Request'类,它将基础作为参数吗? '请求:请求'? –
你还没有解释为什么你不能使用泛型... –
不应该是'Dictionary>'和'addRequest(int seq,请求请求)'? –