2016-04-06 15 views
-1

私は、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) 

これは可能ですか?それがあれば、それは私に多くの時間を節約するだろう。

+1

あり*そのような何か*を行うには、いくつかの方法がありますが、これは萌芽しますXY質問の動的クラスを必要とする 'APIとのやり取り 'は正しくはありません.APIとして型と戻り値をある程度文書化する必要があります。型定義を '他の入力を介して '取得すると、私は大きな休止状態になります。 – Plutonix

+0

APIには、必要な仕様に合わせて作成されたクラスが必要です。クラスの必要な部分を返すAPIへの呼び出しがあります。さらに、このAPIには、現在、または将来、多くの部分があります。この設定を行うと、コードを更新せずにこれらの部分をテストできます。 – KnightsOfTheRoun

+0

'クラスの必要な部分を返す 'とはどういう意味ですか?どのような種類のAPI(サービスまたはDLL)ですか? – Plutonix

答えて

0

私はレイトバインディングが好きではありませんが、オプションがあります(私は自分のオプションが厳密に好きです)。 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 
+1

私は長くて流動的だったクラスのためにこれを持っていました。値の文字列ではなく、元の型を格納する小さなクラスを作成して、変換できるようにすることができます( 'Value.ToString()'はPointやSizeのような問題で問題になります) OPのために直接働くとは思えませんが、カスタマーのコンバーター(APIへの呼び出しがjsonを取ると仮定して)が働くかもしれません。 – 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} 

質問は一種の曖昧ですが、他のフィールドやメソッドを必要としない、または再利用する場合Anonymous Types

+0

これは理論的な質問なのであいまいですが、これが可能かどうかを調べようとしていますが、あなたの提案はまだ難しいので、動的にする必要があります。 リストの文字列として各エントリ dim newpropertyプロパティとして newproperty.name =エントリ newclass.addproperty(newproperty) 次へ 私はそれを行うことができる必要があります – KnightsOfTheRoun

関連する問題