Câu hỏi của tôi liên quan đến việc kiểm tra kiểu trong một chuỗi các phương pháp chung. Giả sử tôi có một phương thức mở rộng cố chuyển đổi một mảng byte thành int, decimal, string hoặc DateTime.Tránh kiểm tra loại quá mức trong các phương pháp chung?
public static T Read<T>(this ByteContainer ba, int size, string format) where T : struct, IConvertible
{
var s = string.Concat(ba.Bytes.Select(b => b.ToString(format)).ToArray());
var magic = FromString<T>(s);
return (T)Convert.ChangeType(magic, typeof(T));
}
Gọi phương thức này là FromString dịch chuỗi được ghép vào một loại cụ thể. Thật không may, logic kinh doanh là hoàn toàn phụ thuộc vào loại T. Vì vậy, tôi kết thúc với một khối if-else Megalithic:
private static T FromString<T>(string s) where T : struct
{
if (typeof(T).Equals(typeof(decimal)))
{
var x = (decimal)System.Convert.ToInt32(s)/100;
return (T)Convert.ChangeType(x, typeof(T));
}
if (typeof(T).Equals(typeof(int)))
{
var x = System.Convert.ToInt32(s);
return (T)Convert.ChangeType(x, typeof(T));
}
if (typeof(T).Equals(typeof(DateTime)))
... etc ...
}
Tại thời điểm này, tôi muốn nhiều phương pháp có cùng tên và các loại khác nhau trở lại, một cái gì đó dọc theo dòng này:
// <WishfulThinking>
private static decimal FromString<T>(string s)
{
return (decimal)System.Convert.ToInt32(s)/100;
}
private static int FromString<T>(string s)
{
return System.Convert.ToInt32(s);
}
// </WishfulThinking>
... nhưng tôi nhận ra điều này là không hợp lệ, như T không thể được hạn chế đến một loại hình cụ thể, và không có nó, tất cả các phương pháp này sẽ có mâu thuẫn tương tự Chữ ký.
Có cách nào khả thi để triển khai FromString mà không cần kiểm tra loại quá mức không? Hoặc có thể có cách nào tốt hơn để tiếp cận vấn đề này hoàn toàn không?
Điều này có vẻ như một vấn đề bạn có thể giải với biểu thức. – lukegravitt