2016-04-18 7 views
1

Ich muss den variablen Objekttyp als Argument an einen Konstruktor übergeben und in der Lage sein, den Variablentyp von der erstellten Methode zurückzugeben. es ist schwer zu erklären, vielleicht wird der Code einen besseren Job machen.Übergeben Sie Variablentypen an einen Konstruktor und geben Sie den gleichen Typ zurück, der übergeben wurde

für die Übergabe des Objekttyps an den Konstruktor, habe ich dies versucht.

public async Task<BlockData.Block> Last() 
{ 
    return await new AsyncConnector<BlockData.Block>(Connection).Get(
     "/chain/last-block" 
     ); 
} 

und es zu empfangen, ich tue dies:

public class AsyncConnector<T> 
{ 
    NisConnection Connection = null; 

    public AsyncConnector(NisConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<T> Get(string uri) 
    { 
     var response = await Connection.Client.GetAsync(Connection.FullUri(uri)); 

     return JsonConvert.DeserializeObject<T>(
      JObject.Parse(await response.Content.ReadAsStringAsync()).ToString() 
     ); 
    } 
} 

Ich habe auch versucht dies:

public async Task<BlockData.Block> Last() 
{ 
    return await new AsyncConnector(Connection).Get<BlockData.Block>(
     "/chain/last-block" 
     ); 
} 

public class AsyncConnector 
{ 
    NisConnection Connection = null; 

    public AsyncConnector(NisConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<T> Get<T>(string uri) 
    { 
     var response = await Connection.Client.GetAsync(Connection.FullUri(uri)); 

     return JsonConvert.DeserializeObject<T>(
      JObject.Parse(await response.Content.ReadAsStringAsync()).ToString() 
     ); 
    } 
} 

die GetAsync Methode muss die gleiche Art und Weise arbeiten, aber für viele verschiedene Objekt Arten.

der Fehler Ich erhalte ist:

Eine Ausnahme vom Typ ‚Microsoft.CSharp.RuntimeBinder.RuntimeBinderException‘ in mscorlib.dll aufgetreten, wurde aber in Benutzercode
Zusätzliche Informationen nicht behandelt: Kann nicht Typ umwandeln ‚Newtonsoft.Json.Linq.JObject‘ auf ‚NemApi.DTOs.BlockObjects.BlockData.Block‘

+0

können Sie die Zeichenfolge direkt deserialisieren, ohne als 'JObject' zu analysieren? – Hendry

+0

was meinst du? – netnoob

+0

es hätte immer noch das Problem, nicht zu wissen, welchen Typ es zu deserialisieren, unabhängig davon, ob es aus JObject oder String deserialisiert. – netnoob

Antwort

0

Wenn Sie einfach ReadAsAsync<T> von System.Net.Http.Formatting verwenden, wird es Ihre JSON zu einem stark typisierte Objekt unter der Haube konvertieren. Sie müssen nicht darüber konvertieren oder analysieren.

public async Task<BlockData.Block> Last() 
{ 
    return await new AsyncConnector(Connection).Get<BlockData.Block>(
     "/chain/last-block"); 
} 

public class AsyncConnector 
{ 
    NisConnection Connection = null; 

    public AsyncConnector(NisConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<T> Get<T>(string uri) 
    { 
     var response = await Connection.Client.GetAsync(Connection.FullUri(uri)); 
     return await response.Content.ReadAsAsync<T>(); 
    } 
} 
+0

response.Content hat keine Methode ReadAsAsync nur ReadAsStringAsync – netnoob

+1

Sie müssen eine Referenz hinzufügen 'System.Net.Http.Formatting' (HttpContentExtensions-Klasse) – Bidou

Verwandte Themen