富不能因爲除了保持通用要求的集合通用的,它是獨立完整的請求。有一個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,請求請求)'? –