Tôi muốn một hàm trợ giúp tra cứu đã nhập cho một bộ sưu tập không đồng nhất: Nó sẽ trả về một cấu trúc hoặc một lớp, nếu không thì không tìm thấy mục đó. Dưới đây là một ví dụ bằng cách sử dụng tra cứu bộ sưu tập tầm thường, nhưng nó có thể là một cuộc gọi cơ sở dữ liệu hoặc bất cứ điều gì.Làm thế nào để thực hiện phương pháp tìm kiếm bộ sưu tập chung có thể trả về cấu trúc lớp hoặc có thể null?
Có cách nào để đạt được điều này với một chữ ký phương pháp duy nhất không?
public T GetClass<T>(string key) where T : class
{
object o;
if (Contents.TryGetValue(key, out o))
{
return o as T;
}
return null;
}
public T? GetStruct<T>(string key) where T : struct
{
object o;
if (Contents.TryGetValue(key, out o))
{
if (o is T)
{
return (T?) o;
}
}
return null;
}
Những gì tôi đã cố gắng:
- Tôi hiểu rằng những hạn chế chung không thể được sử dụng để disambiguate quá tải. Vì vậy, tôi không thể chỉ đơn giản là cung cấp cho hai phương pháp này cùng tên.
- Trả lại
(Default) T
không phải là một tùy chọn vì 0 là giá trị int hợp lệ. - Tôi đã thử gọi bằng
<int ?>
làm loại, nhưng như được thảo luận,Nullable<T>
không phải là loại tham chiếu.
Có cách nào để cho biết rằng tôi sẽ trả về một hộp được đóng hộp không?
tôi nửa như thế này - nhưng nó * cho phép * bạn gọi nó là 'getClass' và trở về 0 cho " tìm thấy với giá trị 0 "và" không tìm thấy "không thể phân biệt được. Thật vậy, bạn có thể vô tình bỏ lỡ '?' Thứ hai trong việc sử dụng mẫu của bạn và nhận được một lỗi khá tinh tế. ('result1' sẽ * không bao giờ * là null, nhưng bạn sẽ mong đợi nó là) –
Tôi nghĩ rằng mặc định cho int? là null – akatakritos
Nhưng nếu giá trị bạn đang tìm kiếm là một int thường xuyên: tôi nghĩ rằng (o là int?) sẽ thất bại bc int? không phải là một int. – akatakritos