2

VB.Net 2010を使用しています。外部(オフザセルフ)アプリケーションによってアプリケーションに入力された(COM)オブジェクトの内容を複製したいと思います。フィールドとプロパティの値を1つずつコピーしたくありません(フィールド/プロパティは将来のアプリケーションビルドで追加または削除される可能性があるため)。

オブジェクトタイプはシリアル化できません。

私は次のようにReflectionを試しました(スレッドで提案されたVBコードは、あるオブジェクトを別のオブジェクトにコピーします):

Imports System.Reflection

Public Class ObjectHelper

    ' Creates a copy of an object
    Public Shared Function GetCopy(Of SourceType As {Class, New})(ByVal Source As SourceType) As SourceType

        Dim ReturnValue As New SourceType
        Dim sourceProperties() As PropertyInfo = Source.GetType().GetProperties()

        For Each sourceProp As PropertyInfo In sourceProperties
            sourceProp.SetValue(
                ReturnValue, 
                sourceProp.GetValue(Source, Nothing),
                Nothing)
        Next

        Return ReturnValue

    End Function

End Class

返されたsourceProperties()配列が空であるため、これは機能しません。

何か案は?

4

1 に答える 1

0

まず、実装にバグがあります

Dim sourceProperties() As PropertyInfo = Source.GetType().GetProperties()

する必要があります

Dim sourceProperties() As PropertyInfo = GetType(SourceType).GetProperties()

Source.GetType()オブジェクトの実際のタイプであるtypeを返します_COMObjectが、オブジェクトによって実装されているインターフェイスタイプを実際に確認する必要があります。

他の解決策は、オブジェクトがIPersistインターフェイスのいずれかを実装しているかどうかを確認し、それを実際のCOMシリアル化に使用することです。これを行うには、オブジェクトをたとえばにキャストしますSystem.Runtime.InteropServices.ComTypes.IPersistFile。残念ながら、他のIPersist *インターフェイスはその名前空間で定義されていないため、どこかからインポートする必要があります。

于 2013-03-14T15:28:37.760 に答える