Создание настраиваемого класса динамически

-4

Я работаю над проектом, в котором мне нужно создать множество пользовательских классов для правильного взаимодействия с 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)

Это возможно? Это спасло бы меня много времени, если это так.

спросил(а) 2021-01-19T17:14:27+03:00 2 месяца, 3 недели назад
1
Решение
87

Мне не нравится поздняя привязка, но есть варианты (мне нравится мой вариант 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

ответил(а) 2021-01-19T17:14:27+03:00 2 месяца, 3 недели назад
43

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}

Вопрос нечеткий, но если вам не нужны другие поля и методы или повторное использование анонимных типов

ответил(а) 2021-01-19T17:14:27+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема