tôi có một loạt các phương pháp mở rộng để giúp đỡ với null-kiểm tra trên các đối tượng IDataRecord, mà tôi đang thực hiện như thế này:Phương pháp chung có thể xử lý cả hai loại Giá trị tham chiếu và Giá trị không hợp lệ?
public static int? GetNullableInt32(this IDataRecord dr, int ordinal)
{
int? nullInt = null;
return dr.IsDBNull(ordinal) ? nullInt : dr.GetInt32(ordinal);
}
public static int? GetNullableInt32(this IDataRecord dr, string fieldname)
{
int ordinal = dr.GetOrdinal(fieldname);
return dr.GetNullableInt32(ordinal);
}
và như vậy, đối với từng loại tôi cần phải giải quyết.
Tôi muốn thực hiện lại các phương pháp này như một phương pháp chung, một phần để giảm dự phòng và một phần để tìm hiểu cách viết các phương pháp chung chung.
Tôi đã viết này:
public static Nullable<T> GetNullable<T>(this IDataRecord dr, int ordinal)
{
Nullable<T> nullValue = null;
return dr.IsDBNull(ordinal) ? nullValue : (Nullable<T>) dr.GetValue(ordinal);
}
mà làm việc miễn là T là một loại giá trị, nhưng nếu T là một loại tài liệu tham khảo nó sẽ không.
Phương pháp này sẽ cần phải trả về kiểu Nullable nếu T là một loại giá trị và mặc định (T) nếu không. Tôi sẽ thực hiện hành vi này như thế nào?
Đó là giải pháp rất tồi. Nếu nằm trong giá trị NULL datarecord, bạn không muốn giá trị mặc định của int. NULL và ZERO là các giá trị khác nhau. – TcKs
NẾU giá trị trong cơ sở dữ liệu là nullable, thì T sẽ là một Nullable trong trường hợp NULL là giá trị mặc định sẽ được trả về. –
BFree
Nếu vậy, tại sao phương pháp mở rộng này, nếu bạn có thể sử dụng chỉ đơn giản là "dr [thứ tự] như int?" ? – TcKs