2013-10-04 3 views
7

私はこの質問に対する短い答えが "いいえ"だと思うが、C#4.0では実行時に動的キーワードの使用を検出する機能に興味がある。具体的にはメソッドのジェネリック型パラメータとして使用します。いくつかの背景を与えること実行時にタイプパラメータとして "dynamic"キーワードを使用することを検出

、我々は例えば、レスポンスをデシリアライズするときに使用しなければならないタイプを指定するには、typeパラメータを取る私たちのプロジェクトの数の間で共有ライブラリにRestClientクラスを持っている:

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    var request = this.GetRequest(uri, headers); 
    return request.GetResponse<TResource>(); 
} 

残念ながら(タイプを簡潔にするためにここに入らない理由のために)、動的型を返すために型パラメータとしてdynamicを使用すると正しく動作しません - 私たちは、動的応答型を返すクラス:

public IRestResponse<dynamic> Get(Uri uri, IDictionary<string, string> headers) 
{ 
    var request = this.GetRequest(uri, headers); 
    return request.GetResponse(); 
} 

しかし、最初のメソッドの型パラメータとしてdynamicを使用すると、実際の問題をマスクし、すべてのことを頭痛の種にする非常に奇妙なエラーが発生します。 APIを使用している他のプログラマーを助けるために、最初のメソッドでダイナミックの使用を検出して、コンパイルしないか、または使用したときに例外がスローされるようにしたい「動的応答タイプが必要な場合は、この他のメソッドを使用してください。

基本的には、次のいずれか

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource is not dynamic 

または

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    if (typeof(TResource).isDynamic()) 
    { 
      throw new Exception(); 
    } 

    var request = this.GetRequest(uri, headers); 

    return request.GetResponse<TResource>(); 
} 

は、これらのもののいずれかの可能性はありますか?私たちはVS2010と.Net 4.0を使用していますが、新しい言語機能を使用することができれば、将来の参照のために.Net 4.5ソリューションに興味があります。

+0

実行時の 'TResource'は、ユーザが' dynamic'を指定したときに単に 'object'です。ユーザーは ''を取得しようとしますか?それは 'Get 'とは違って扱われる必要がありますか? –

+0

私はあなたのタイトルを編集しました。 「[質問には「タイトル内に「タグ」を含める必要がありますか」(http://meta.stackexchange.com/questions/19190/)」を参照してください。コンセンサスは「いいえ、そうすべきではありません」です。 –

+0

@TimS。ええを使用すると、潜在的にOKです - 私はそれを禁止したくない場合は... –

答えて

3

誰かがGet<dynamic>を実行したとき、実行時にTResourceobjectです。 Get<object>が実際にやりたいことではない限り、予期しない場合(objectdynamic)の両方を取得するには、がobjectであるかどうかを確認するだけです。

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    if (typeof(TResource) == typeof(object)) 
    { 
     throw new Exception("Use the dynamic one"); 
    } 

    var request = this.GetRequest(uri, headers); 

    return request.GetResponse<TResource>(); 
} 
+0

上記のコメントに記載されているように、私は違法を避けたい可能であればを取得してください... –

関連する問題