إنشاء أسلوب عام لتحويل السلسلة إلى أرقام قيم الفارغة

StackOverflow https://stackoverflow.com/questions/1019346

  •  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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top