Giữ ý tưởng về công cụ chuyển đổi để bỏ qua khối chuyển đổi, bạn có thể sử dụng khái niệm Nhập Vịt. Về cơ bản, bạn muốn biến một chuỗi thành X, vì vậy bạn tạo một phương thức gọi X.TryParse (chuỗi, x X) nếu X có TryParse trên đó, nếu không bạn không bận tâm (Hoặc tôi giả sử bạn có thể ném một lỗi). Bạn sẽ làm điều này như thế nào? Phản ánh và Generics.
Về cơ bản, bạn sẽ có một phương pháp sẽ lấy một loại và sử dụng sự phản chiếu để xem nó có TryParse trên nó hay không. Nếu bạn tìm thấy một phương pháp như vậy thì bạn gọi nó và trả lại bất cứ thứ gì TryParse quản lý để có được. Điều này hoạt động tốt với bất kỳ loại giá trị nào như nói Decimal hoặc DateTime.
public static class ConvertFromString
{
public static T? ConvertTo<T>(this String numberToConvert) where T : struct
{
T? returnValue = null;
MethodInfo neededInfo = GetCorrectMethodInfo(typeof(T));
if (neededInfo != null && !numberToConvert.IsNullOrEmpty())
{
T output = default(T);
object[] paramsArray = new object[2] { numberToConvert, output };
returnValue = new T();
object returnedValue = neededInfo.Invoke(returnValue.Value, paramsArray);
if (returnedValue is Boolean && (Boolean)returnedValue)
{
returnValue = (T)paramsArray[1];
}
else
{
returnValue = null;
}
}
return returnValue;
}
}
đâu GetCorrectMethodInfo sẽ giống như thế này:
private static MethodInfo GetCorrectMethodInfo(Type typeToCheck)
{
MethodInfo returnValue = someCache.Get(typeToCheck.FullName);
if(returnValue == null)
{
Type[] paramTypes = new Type[2] { typeof(string), typeToCheck.MakeByRefType() };
returnValue = typeToCheck.GetMethod("TryParse", paramTypes);
if (returnValue != null)
{
CurrentCache.Add(typeToCheck.FullName, returnValue);
}
}
return returnValue;
}
Và sử dụng sẽ là:
decimal? converted = someString.ConvertTo<decimal>();
Tôi ghét cắm bản thân mình, nhưng tôi đã này giải thích đầy đủ ở đây:
GetCorrectMethodInfo
Rest of It
Nguồn
2008-11-20 16:08:54
Lợi ích khác được thêm vào là phương pháp TryParse trả về biến boolean, vì vậy rất dễ viết mã cho các kịch bản thành công và lỗi của bạn khi phân tích cú pháp số. –
nhưng nếu bạn chỉ quan tâm nếu đó là số nguyên hay không, TryParse có lợi thế là yêu cầu bạn khai báo biến cho tham số ngoài –