Mặc dù câu trả lời @ theCoop là chính xác (không có gì về cơ bản là sai khi đặt mã của anh ấy vào phần thân của phương thức bạn đã cung cấp), có một số gotchas khổng lồ ở đây.
Nullable<T>
được xử lý theo thời gian chạy dưới dạng loại 'đặc biệt' có một số ngữ nghĩa rất đặc biệt. Đặc biệt, khi một Nullable<T>
được đóng hộp:
- Nếu
HasValue == true
, nó hoạt động giống như một đóng hộp T
, làm cho nó không thể cho mã downsteam nói nếu đối tượng tạo ra được sản xuất bởi đấm bốc một T
hoặc bằng cách đấm bốc một Nullable<T>
. Mở hộp đến T
và Nullable<T>
đều có thể.
- Nếu
HasValue == false
, quyền anh chỉ trả lại null
. Mở hộp đến T
sẽ ném, mở hộp đến Nullable<T>
sẽ thành công, trong đó HasValue == false
.
Trong cả hai trường hợp, boxedNullableObject.GetType()
sẽ không tiết lộ rằng đối tượng được tạo ra bởi quyền anh là Nullable<T>.
Tôi không thể nghĩ ra bất kỳ loại giá trị nào khác thể hiện hành vi lạ như vậy.
Ví dụ, hãy xem xét:
// Output: "System.Nullable`1[System.Int32]"
Console.WriteLine(typeof(int?));
object boxedNullableInt32WithValue = new int?(0);
// Output: "System.Int32", NOT "System.Nullable`1[System.Int32]"
Console.WriteLine(boxedNullableInt32WithValue.GetType());
object boxedNullableInt32WithoutValue = new int?();
// NullReferenceException is thrown
Console.WriteLine(boxedNullableInt32WithoutValue.GetType());
Do đó, viết một phương pháp như:
public static bool IsObjectANullableT(this object obj) { ... }
là một ý tưởng thực sự xấu.
EDIT: Trên một lưu ý khác, tôi vừa nhận ra có một phương pháp khung làm những gì bạn cần bằng kỹ thuật tương tự như mẫu của @ theCoop: Nullable.GetUnderlyingType
.
Cách sử dụng:
static bool IsNullable(Type type)
{
return Nullable.GetUnderlyingType(type) != null;
}
EDIT: Chỉ cần thấy rằng đây cũng đã được đề cập bởi @TheCoop trong câu trả lời của mình. Lỗi của tôi.
Rất tốt! Cảm ơn. (Tôi luôn luôn quên về '<>' trong sự phản ánh.) –
Điều này sẽ không làm việc trong nhiều tình huống phổ biến kể từ khi CLR xử lý 'Nullable' như là một loại đặc biệt. Đặc biệt, nó được đóng hộp vào một 'T' đóng hộp. –
Ani
@Ani: ý của bạn là gì? Bởi 'T', tôi đang đề cập đến' typeof (T) ' – thecoop