2010-02-02 3 views
0

Я пытаюсь создать механизм передачи, где я могу взять объект класса и преобразовать его в объект webservice с минимальным количеством кода.Перенести объект 1 типа на объект другого типа

У меня был довольно хороший успех в этом подходе, но мне нужно уточнить техник, когда у меня есть пользовательские классы, возвращаемые в качестве свойств моего исходного объекта.

Private Sub Transfer(ByVal src As Object, ByVal dst As Object) 
    Dim theSourceProperties() As Reflection.PropertyInfo 

    theSourceProperties = src.GetType.GetProperties(Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance) 

    For Each s As Reflection.PropertyInfo In theSourceProperties 
     If s.CanRead AndAlso (Not s.PropertyType.IsGenericType) Then 
      Dim d As Reflection.PropertyInfo 
      d = dst.GetType.GetProperty(s.Name, Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance) 
      If d IsNot Nothing AndAlso d.CanWrite Then 
       d.SetValue(dst, s.GetValue(src, Nothing), Nothing) 
      End If 
     End If 
    Next 
End Sub 

Что мне нужно то, что некоторые определения, если источник собственность является основным типом (строки, int16, int32 и т.д., а не комплексного типа).

Я смотрел на s.PropertyType.Attributes и проверял маски на этом, но я не могу найти ничего, что указывает, что это базовый тип.

Есть ли что-то, что я могу проверить, чтобы узнать это?

+0

Type.IsPrimitiveImpl Метод При переопределении в производном классе, реализует IsPrimitive свойства и определяет, является ли один из примитивных типов Типа. http://msdn.microsoft.com/en-us/library/system.type.isprimitiveimpl%28VS.71%29.aspx – abmv

ответ

0

С благодарностью за отзыв от abmv, это конечный результат, который я использовал. Мне все еще нужно было кодировать несколько конкретных свойств, но большинство из них были обработаны автоматически с помощью этого механизма.

Private Sub Transfer(ByVal src As Object, ByVal dst As Object) 
    Dim theSourceProperties() As Reflection.PropertyInfo 

    theSourceProperties = src.GetType.GetProperties(Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance) 

    For Each s As Reflection.PropertyInfo In theSourceProperties 
     If s.CanRead AndAlso (Not s.PropertyType.IsGenericType) And (s.PropertyType.IsPrimitive Or s.PropertyType.UnderlyingSystemType Is GetType(String)) Then 
      Dim d As Reflection.PropertyInfo 
      d = dst.GetType.GetProperty(s.Name, Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance) 
      If d IsNot Nothing AndAlso d.CanWrite Then 
       d.SetValue(dst, s.GetValue(src, Nothing), Nothing) 
      End If 
     End If 
    Next 
End Sub 
Смежные вопросы