2017-11-09 14 views
0

型パラメーター化されたプロシージャーにパラメーターとして渡されるクラスの共有プロパティーにアクセスしようとしています。 理由私はこれをやっているので、クラス内のプロパティとして(他のクラス固有のものの中でも)さまざまな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のタイプに基づいて何らかのエンドポイントルックアップを実行できることを認識していますが、上記は非常にきれいな解決策であり、可能ならばそれを働かせたいと思います。

アイデア?

+1

あなたはすでにそのメソッドを制約として使用して 'BaseClass'型に結びつけているので、メソッド内で単に' BaseClass.EndPoint'を得るのを避けるためにどの点がありますか? – jmcilhinney

+0

基本クラスの共有プロパティは、すべてのサブクラスで変更されます。言い換えれば、 'Person.EndPoint'は、その値が基本クラスに格納されているだけなので、常に' Event.EndPoint'と同じになります。 – SSS

+0

@jmcilhinney 'MakeGetCall'行が実行されると' BaseClass.Endpoint'はnullになります。 'Person/Event'は、' Return'行で逆シリアル化が発生したときにのみインスタンス化されます。しかし、あなたは私に考えさせました。私は、 'Dim oDummy As BaseClass = Activator.CreateInstance(Of T)()'というコールの前にダミーの 'Record'オブジェクトをインスタンス化し、あなたの提案を使用することを許可しました。ちょっと面倒ですが、代替案よりも優れています。ありがとう。 – SteveCinq

答えて

0

あなたは各サブクラスごとに異なるようにEndPointをしたいと仮定すると、あなたは

MustInherit Class BaseClass 
    Public MustOverride Property EndPoint As String 
End Class 

は次に、各サブクラスで定数を返す...代わり SharedMustOverrideを使用する必要があります

Class Person 
    Inherits BaseClass 
    Public Overrides Property EndPoint As String 
    Get 
     Return "/Person" 
    End Get 
あなたがしたい場合があります

EndPointReadOnlyと宣言してください。

EndPointにアクセスするには、クラスのインスタンスが必要です(Sharedではないため)。パラメータのないコンストラクタがある場合は、必要に応じて(New Person).EndPointを使用できます。

関連する問題