2013-10-04 12 views
7

Sospetto che la risposta breve a questa domanda sia "no", ma sono interessato alla possibilità di rilevare l'utilizzo della parola chiave dinamica in fase di esecuzione in C# 4.0, nello specifico come parametro di tipo generico per un metodo.Rilevamento dell'utilizzo della parola chiave "dinamica" come parametro di tipo in fase di esecuzione

per dare qualche sfondo, abbiamo una classe RestClient in una libreria condivisa tra un certo numero dei nostri progetti che prende un parametro di tipo per specificare un tipo che dovrebbe essere utilizzata quando de-serializzazione della risposta, ad esempio:

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

Sfortunatamente (a causa di motivi per cui non entrerò qui per brevità) l'utilizzo di dynamic come parametro di tipo per restituire un tipo dinamico non funziona correttamente - abbiamo dovuto aggiungere una seconda firma a la classe per restituire un tipo di risposta dinamica:

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

Tuttavia, l'uso di dynamic come parametro type per il primo metodo causa un errore molto strano che maschera il problema reale e rende il debug di tutto un mal di testa. Per aiutare gli altri programmatori che usano l'API, vorrei provare a rilevare l'uso della dinamica nel primo metodo in modo che non si compili affatto o quando viene usata un'eccezione che dice qualcosa lungo le linee di "usa questo altro metodo se vuoi un tipo di risposta dinamica".

Fondamentalmente uno:

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

o

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>(); 
} 

Sono una di queste cose possibili? Stiamo utilizzando VS2010 e .Net 4.0, ma sarei interessato a una soluzione .Net 4.5 per riferimenti futuri, se è possibile utilizzare funzionalità linguistiche più recenti.

+0

'TResource' in fase di esecuzione è semplicemente' oggetto' quando l'utente ha specificato 'dynamic'. Gli utenti proverebbero mai a "Get "? Deve essere gestito diversamente da 'Get '? –

+0

Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

+0

@TimS. Sì, l'uso di Get è potenzialmente OK - Non voglio dichiararlo illegale se non devo ... –

risposta

3

Quando qualcuno fa Get<dynamic>, al runtime TResource è object. Finché Get<object> non è qualcosa che i tuoi utenti vorranno realmente fare, puoi semplicemente verificare se TResource è object per intercettare entrambi i casi imprevisti (object e dynamic).

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

Come notato nei commenti sopra, vorrei evitare la messa al bando Ottieni se possibile ... –

Problemi correlati