|
Hilfe zum Thema: C-Sharp-und-Net, Lesen, Klasse
2 unbekannte Objekte miteinander synchronisieren
Hi, ich habe ein kleines Problem: Ich habe zwei unbekannte Objekte, von denen ich nicht weiß (oder wissen möchte), welche Properties etc. diese haben. Nun möchte ich das eine Objekt mit den Inhalten des anderen Objektes ersetzen, sprich synchronisieren, wenn sich die Werte in den Objekten unterscheiden. Das Problem ist, dass ich zwar alle Properties dynamisch auslesen kann, aber die Zuordnung Objekt1.PropertyValue = Objekt2.PropertyValue nicht hinbekomme, da ich nicht weiß, welches Property ich in dem anderen Objekt aufrufen muss. Mein Beispiel basiert auf einer Sprachen-Klasse: Public Class Language Private m_strName As String = String.Empty Public Property Name() As String Get Return m_strName End Get Set(ByVal value As String) m_strName = value End Set End Property Public Sub New(ByVal strLanguage As String) m_strName = strLanguage End Sub Public Sub New() End Sub End Class Jetzt erstelle ich zwei Objekte und möchte diese synchronisieren mit Reflection: Imports System.Reflection Module Module1 Sub main() Dim dict As Dictionary(Of String, Language) = New Dictionary(Of String, Language) Dim oLang As New Language("german") Dim oLang1 As New Language("english") dict.Add(oLang.Name.ToLower, oLang) dict.Add(oLang1.Name.ToLower, oLang1) GetPropertiesData("", "Language", dict) Console.WriteLine() Dim oLangNew As New Language("deutsch") SetPropertiesData("", "Language", oLang, oLangNew) Console.ReadLine() End Sub 'todo: noch das dict als parameter generisch machen! evtl. über generics. Public Sub GetPropertiesData(ByVal strNamespace As String, ByVal strClassname As String, ByVal dict As Dictionary(Of String, Language)) Dim objType As Type = Nothing If String.IsNullOrEmpty(strNamespace) Then objType = Assembly.GetExecutingAssembly.GetType(Assembly.GetExecutingAssembly.GetName.Name & "." & strClassname, False, True) Else objType = Assembly.GetExecutingAssembly.GetType(strNamespace & "." & strClassname, False, True) End If For Each objPropInfo As PropertyInfo In objType.GetProperties For Each oLang As Language In dict.Values Console.WriteLine("PropName: " & objPropInfo.Name & " PropValue: " & objPropInfo.GetValue(oLang, Nothing).ToString) Next Next End Sub Public Sub SetPropertiesData(ByVal strNamespace As String, ByVal strClassname As String, ByVal objLangOld As Language, ByVal objLangNew As Language) Dim objType As Type = Nothing If String.IsNullOrEmpty(strNamespace) Then objType = Assembly.GetExecutingAssembly.GetType(Assembly.GetExecutingAssembly.GetName.Name & "." & strClassname, False, True) Else objType = Assembly.GetExecutingAssembly.GetType(strNamespace & "." & strClassname, False, True) End If For Each objPropInfo As PropertyInfo In objType.GetProperties 'objType.GetProperty("????").SetValue(objLangOld, objLangNew, Nothing) 'todo: entsprechendes property (objpropinfo) bei objlang... holen u. davon wert setzen objPropInfo.SetValue(objLangOld, objLangNew, Nothing) Console.WriteLine("PropName: " & objPropInfo.Name & " PropValue: " & objPropInfo.GetValue(objLangOld, Nothing).ToString) Next End Sub End Module Ich hoffe ich habe mich verständlich ausgedrückt. Ich würde mich riesig freuen, wenn jemand das Problem schon gelöst hat :-) Viele Grüße Johannes
|
Google-Anzeigen
|
|