2016-04-06 20 views
-1

Ich arbeite an einem Projekt, wo ich eine Vielzahl von benutzerdefinierten Klassen erstellen muss, um ordnungsgemäß mit einer API interagieren (Während ich weiß, es könnte Fragen zu warum und so, aber die kurze ist es muss sei so).Erstellen Sie benutzerdefinierte Klasse dynamisch

Gibt es eine Möglichkeit, eine vollständige benutzerdefinierte Klasse dynamisch im laufenden Betrieb zu erstellen? Also statt

Ich möchte in der Lage sein, ein neues Objekt zu erstellen und durch andere Eingabe dynamisch erstellen.

dim NewClass as object 
dim NewProperty as property 
NewProperty.name="Height" 
NewProperty.datatype=string 
NewClass.AddProperty(NewProperty) 

Ist das möglich? Es würde mir viel Zeit sparen, wenn es ist.

+1

Es gibt mehrere Möglichkeiten, etwas * wie *, das zu tun, aber das riecht einer XY-Frage. 'Interaktion mit einer API', die dynamische Klassen benötigt, klingt nicht richtig - als API müssten die Typen und Returns zu einem gewissen Grad dokumentiert werden. Typdefinitionen durch andere Eingaben zu erhalten, würde mir eine große Pause einbringen. – Plutonix

+0

Die API erfordert eine Klasse, die nach den erforderlichen Spezifikationen erstellt wird. Es gibt einen Aufruf an die API, die die erforderlichen Teile der Klasse zurückgibt. Darüber hinaus gibt es viele Teile für diese API, die in Arbeit sind oder in Zukunft, und mit dieser Konfiguration können diese Teile getestet werden, ohne den Code zu aktualisieren. – KnightsOfTheRoun

+0

Was bedeutet 'die notwendigen Teile der Klasse '? Welche Art von API (Dienst oder DLL)? – Plutonix

Antwort

0

Ich mag keine späte Bindung, aber es gibt Optionen (Ich mag meine Option streng auf). Wie die Verwendung der DynamicObject oder ExpandoObject Klasse. Deine Frage ist vage, also habe ich keine Ahnung, ob es funktionieren kann.

Sub Main() 

    Dim test As Object = New SampleDynamicClass() 

    test.SomeProperty = "123" 

    Console.WriteLine(test.SomeProperty) 
    Console.ReadLine() 

End Sub 

Public Class SampleDynamicClass 
    Inherits DynamicObject 

    Private _values As New Dictionary(Of String, String) 

    Public Sub New() 

    End Sub 

    Public Function GetPropertyValue(ByVal propertyName As String) As String 

     Return _values(propertyName) 
    End Function 

    Public Function SetPropertyValue(ByVal propertyName As String, ByVal value As Object) As Boolean 

     If _values.ContainsKey(propertyName) Then 
      _values(propertyName) = value.ToString() 
     Else 
      _values.Add(propertyName, value.ToString()) 
     End If 

     Return True 
    End Function 

    Public Overrides Function TryGetMember(ByVal binder As GetMemberBinder, 
              ByRef result As Object) As Boolean 
     result = GetPropertyValue(binder.Name) 
     Return If(result Is Nothing, False, True) 
    End Function 

    Public Overrides Function TryInvokeMember(ByVal binder As InvokeMemberBinder, 
               ByVal args() As Object, 
               ByRef result As Object) As Boolean 
     result = GetPropertyValue(binder.Name) 
     Return If(result Is Nothing, False, True) 
    End Function 

    Public Overrides Function TrySetMember(binder As SetMemberBinder, value As Object) As Boolean 
     Return SetPropertyValue(binder.Name, value) 
    End Function 
+1

Ich hatte so etwas für eine Klasse, die lang und flüssig war. Anstelle von String für den Wert könnten Sie eine kleine Klasse zum Speichern des Originaltyps erstellen, so dass diese zurückkonvertiert werden kann ("Value.ToString()" wird mit einigen Dingen wie Punkt und Größe problematisch sein - natürlich wissen wir nicht ob Ich glaube nicht, dass dies direkt für das OP funktionieren würde, aber gekoppelt mit einem Kundenkonverter (vorausgesetzt, der Aufruf an die API dauert json) kann es funktionieren. Es ist schwer zu sagen, wenn das OP Ihnen nur sagen wird, was Sie denken muss wissen – Plutonix

0
Dim person = New With {Key .Height = 12} 
Dim personTypes = New With {Key .Happy = 1, .Sad = 2} 
Dim personsAndTypes = New With {Key .Person = person, .Type = personTypes} 

Die Frage ist eine Art vage, aber wenn Sie keine Notwendigkeit für andere Felder und Methoden haben oder Wiederverwendung Anonymous Types

+0

Die Frage ist vage, weil es eine Theoriefrage ist.Ich versuche herauszufinden, ob das möglich ist.Ihr Vorschlag hier ist immer noch hart codiert, ich brauche dynamische.Nach für jeden Eintrag als String in Liste dim newproperty als Eigenschaft newproperty.name = Eintrag newclass.addproperty (newproperty) next Ich muss das können – KnightsOfTheRoun

Verwandte Themen