إنشاء أسلوب عام لتحويل السلسلة إلى أرقام قيم الفارغة
-
06-07-2019 - |
سؤال
ولدي 3 وظائف مماثلة، وهذا التغيير فقط على أساس نوع عددي:
<Extension()> _
Public Function ToNullableShort(ByVal str As String) As Short?
Dim intReturn As Short
If Short.TryParse(str, intReturn) Then
Return intReturn
Else
Return Nothing
End If
End Function
<Extension()> _
Public Function ToNullableByte(ByVal str As String) As Byte?
Dim intReturn As Byte
If Byte.TryParse(str, intReturn) Then
Return intReturn
Else
Return Nothing
End If
End Function
<Extension()> _
Public Function ToNullableLong(ByVal str As String) As Long?
Dim intReturn As Long
If Long.TryParse(str, intReturn) Then
Return intReturn
Else
Return Nothing
End If
End Function
وكنت أحاول أن جعل وظيفة عامة من هذا، ولكن لا يمكن أن نفعل ذلك. كيف يمكنني جعل وظيفة عامة من شأنها أن تأخذ T محددة وجعله قيم الفارغة (من T)؟
المحلول
وهناك سؤال مماثل هنا (في C #): تحويل سلسلة لنوع قيم الفارغة (كثافة العمليات، انقر نقرا، الخ ...)
Public Function ConvertString(Of T As Structure)(ByVal value As String) As System.Nullable(Of T)
Try
Return DirectCast(Convert.ChangeType(value, GetType(T)), T)
Catch
Return Nothing
End Try
End Function
نصائح أخرى
وماذا عن:
Public Shared Function Parse(Of T As Structure)(ByVal value As String) As T?
If String.IsNullOrEmpty(value) Then
Return Nothing
End If
Return New T?(DirectCast(TypeDescriptor.GetConverter(GetType(T)).ConvertFromInvariantString(value), T))
End Function
و(لاحظ أنا استخدم عاكس لترجمة ذلك من C # أدناه)
هل يمكن أن تضيف حاول / catch حول ConvertFromInvariantString
، ولكن لنكون صادقين كنت قد وليس رمز رمي استثناء إذا أعطي شيئا stoopid - ترك بلا قيم لحالة فارغة
وميزة هذا هو أنه يعمل مع البنيات الخاصة بك، ما دمت ربط نوع المحول معهم، والتي يمكنك القيام بذلك بسهولة (مع سمة أو في وقت التشغيل).
public static T? Parse<T>(string value) where T : struct
{
if (string.IsNullOrEmpty(value)) return null;
return (T)TypeDescriptor.GetConverter(typeof(T))
.ConvertFromInvariantString(value);
}
لا تنتمي إلى StackOverflow