2013-10-04 17 views
7

Ich vermute, die kurze Antwort auf diese Frage ist "Nein", aber ich bin in der Fähigkeit interessiert, die Verwendung des dynamischen Schlüsselwort zur Laufzeit in C# 4.0 zu erkennen, speziell als generischer Typparameter für eine Methode.Erkennung der Verwendung von "dynamischen" Schlüsselwort als Typparameter zur Laufzeit

einige Hintergrundinformationen zu geben, haben wir eine RestClient Klasse in einer Bibliothek unter mehreren unserer Projekte geteilt, die einen Typ-Parameter nimmt einen Typ angeben, die verwendet werden sollte, wenn die Antwort De-Serialisierung, zB:

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

Leider (aus Gründen, auf die ich hier nicht kurz eingehen werde), die Verwendung von dynamic als Typparameter, um einen dynamischen Typ zurückzugeben, funktioniert nicht richtig - wir mussten eine zweite Signatur hinzufügen die Klasse, die einen dynamischen Antworttyp zurückgibt:

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

Die Verwendung von dynamic als Typparameter für die erste Methode führt jedoch zu einem sehr merkwürdigen Fehler, der das eigentliche Problem maskiert und das Debugging der gesamten Sache zu einem Problem macht. Um die anderen Programmierern mit Hilfe der API, um zu helfen, würde Ich mag die Verwendung von dynamischen in der ersten Methode, um zu versuchen und zu erkennen, so dass entweder es wird überhaupt nicht kompilieren oder wenn es verwendet wird, eine Ausnahme zu sagen etwas entlang der Linien geworfen Verwenden Sie diese andere Methode, wenn Sie eine dynamische Antwortart wünschen.

Grundsätzlich entweder:

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

oder

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

sind entweder diese Dinge möglich? Wir verwenden VS2010 und .Net 4.0, aber ich würde Interesse an einer .Net 4.5-Lösung für zukünftige Referenz haben, wenn es möglich ist, neuere Sprachfunktionen zu verwenden.

+0

'TResource' zur Laufzeit ist einfach' Objekt', wenn der Benutzer 'dynamic' angegeben hat. Würden Benutzer jemals versuchen, "" zu bekommen? Muss das anders gehandhabt werden als Get ? –

+0

Ich habe deinen Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+0

@TimS. ja Verwendung von Get ist möglicherweise OK - ich will outlaw nicht, dass, wenn ich muß nicht ... –

Antwort

3

Wenn jemand Get<dynamic> tut, ist zur Laufzeit TResourceobject. Solange Get<object> eigentlich wollen würde nicht etwas, das Ihr Benutzer ist, können Sie einfach überprüfen, ob TResourceobject sowohl unerwartete Fälle (object und dynamic) zu fangen.

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

Wie in den Kommentaren oben erwähnt, möchte ich vermeiden, zu verbieten Holen Sie wenn möglich ... –

Verwandte Themen