Создание настраиваемого класса динамически
Я работаю над проектом, в котором мне нужно создать множество пользовательских классов для правильного взаимодействия с API (хотя я знаю, что могут возникнуть вопросы о том, почему и тому подобное, но это должно быть так).
Есть ли способ создать полный пользовательский класс динамически "на лету"? Поэтому вместо
class person
Private _Height
Property Height As Integer
Get
Return _Height
End Get
Set(value As Integer)
_Height = value
End Set
End Property
'Continue for all properties of person
Я хотел бы иметь возможность создавать новый объект, а через другие вводить его динамически.
dim NewClass as object
dim NewProperty as property
NewProperty.name="Height"
NewProperty.datatype=string
NewClass.AddProperty(NewProperty)
Это возможно? Это спасло бы меня много времени, если это так.
Мне не нравится поздняя привязка, но есть варианты (мне нравится мой вариант strict on). Как с помощью DynamicObject или ExpandoObject класса. Ваш вопрос нечеткий, поэтому я понятия не имею, может ли он работать.
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
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}
Вопрос нечеткий, но если вам не нужны другие поля и методы или повторное использование анонимных типов