型パラメーター化されたプロシージャーにパラメーターとして渡されるクラスの共有プロパティーにアクセスしようとしています。 理由私はこれをやっているので、クラス内のプロパティとして(他のクラス固有のものの中でも)さまざまなAPIコールエンドポイントを埋め込むことができます。私はいくつかの同様のSOの記事を読んだが、それは可能ではないことを確かめるために十分近いものはない(私はそう思われる)。型パラメーターとして渡されたクラスの共有プロパティにアクセスする方法
以下は、構造の本質である - 終わりに向かっていくつかの擬似コードがあります:私の小さな頭に
MustInherit Class BaseClass
Shared Property Endpoint As String
End Class
Class Person
Inherits BaseClass
Property Age As Integer
Property Name As String
Sub New()
_Endpoint = "/GetPerson"
End Sub
End Class
Class Event
Inherits BaseClass
Property When As Date
Property Type As String
Sub New()
_Endpoint = "/GetEvent"
End Sub
End Class
Function Retrieve(T As BaseClass)(Id As String) As T
Dim oResp As HttpResponse = MakeGetCall(T.Endpoint, Id) <- T.Endpoint throws a compile error
Return Deserialize(Of T)(oResp.Content)
End Function
Dim oPerson As Person = Retrieve(Of Person)("123")
Dim oEvent As Event = Retrieve(Of Event)("123")
、私はT
のため、基本クラスのプロパティを含むBaseClass
である、と考えているだろうEndpoint
、私は大丈夫でしょう。しかし一見そうではありません。
私はSOや他の場所でこれを無駄に克服するためにここからかなりのものを試しました。はい、私はT
のタイプに基づいて何らかのエンドポイントルックアップを実行できることを認識していますが、上記は非常にきれいな解決策であり、可能ならばそれを働かせたいと思います。
アイデア?
あなたはすでにそのメソッドを制約として使用して 'BaseClass'型に結びつけているので、メソッド内で単に' BaseClass.EndPoint'を得るのを避けるためにどの点がありますか? – jmcilhinney
基本クラスの共有プロパティは、すべてのサブクラスで変更されます。言い換えれば、 'Person.EndPoint'は、その値が基本クラスに格納されているだけなので、常に' Event.EndPoint'と同じになります。 – SSS
@jmcilhinney 'MakeGetCall'行が実行されると' BaseClass.Endpoint'はnullになります。 'Person/Event'は、' Return'行で逆シリアル化が発生したときにのみインスタンス化されます。しかし、あなたは私に考えさせました。私は、 'Dim oDummy As BaseClass = Activator.CreateInstance(Of T)()'というコールの前にダミーの 'Record'オブジェクトをインスタンス化し、あなたの提案を使用することを許可しました。ちょっと面倒ですが、代替案よりも優れています。ありがとう。 – SteveCinq