2017-05-26 1 views
-2

(https://github.com/tommcclean/XContext)C# Versuch Allgemeinliste zurückkehren „Kann nicht implizit Typ umwandeln“

Ich schreibe eine Bibliothek, speichert und ruft Daten unter Verwendung von XML-Dateien auf dem Dateisystem. Eine Klasse namens XMemory soll die einmal abgerufenen Werte wie einen Cache speichern.

Schritt 1: Laden Sie die XML-Datei von einem beliebigen Objekt. Verwenden von serialisiertem XML, das in einer Datei gespeichert ist.

DemoEntity. 

Schritt 2: XML in eine Liste des Objekts deserialisieren.

List<DemoEntity>. 

Schritt 3: Speichern Sie die Liste des Objekts in einer Klasseneigenschaft für den späteren Abruf.

Problem: Ich verwende T, damit ich zur Laufzeit Objekte übergeben kann. Ich kann nicht aus der Liste im Speicher abrufen und als Liste zurückgeben.

Hinweis: XEntity ist eine Schnittstelle, die jedes unterstützte Objekt implementieren muss, um diese Bibliothek zu verwenden.

internal class XMemory 
{ 
    private List<List<XEntity>> EntityContents { get; set; } = new List<List<XEntity>>(); 

    internal List<T> Read<T>() 
    { 
     var entityContent = EntityContents.FirstOrDefault(); 

     return entityContent; 
    } 
} 

Der Fehler lautet: „Kann nicht implizit

+0

Ich verstehe nicht, was der Zweck von Generika hier ist. Hast du ein praktisches Beispiel? –

+0

Ich möchte diese Bibliothek als Referenz in anderen Projekten hinzufügen können. Dieses Projekt wird die in meinen anderen Projekten erstellten Objekte nicht kennen. Also verwende ich T aus diesem Grund. So kann ich ein Objekt erstellen und die Bibliothek in XML serialisieren und später abrufen –

+0

Entschuldigung, wenn ich das Problem nicht gut erklären kann. Ich habe einen Link zu meinem Projekt hinzugefügt, wenn das hilft (https://github.com/tommcclean/XContext) Das Demo-Projekt hebt hervor, was ich erreichen möchte –

Antwort

3

Das Problem ist, dass die Compiler keine Möglichkeit, dass das, was innerhalb von EntityContents zu wissen muss, ist eine Instanz von T. Aus diesem Grund müssen Sie die Werte explizit umwandeln:

internal List<T> Read<T>() 
{ 
    return EntityContents.First().Cast<T>().ToList() 
} 
0

Sie Typ‚System.Collections.Generic.List‘auf‚System.Collections.Generic.List‘umwandeln sollte den Typ angeben T implementieren sollten (wenn wir für eine Schnittstelle) ot erben sprechen (wenn wir für eine Klasse sprechen) die XEntity:

internal List<T> Read<T>() where T : XEntity 
{ 
    var entityContent = EntityContents.FirstOrDefault(); 

    return entityContent; 
} 

Trotz der Tatsache, dass die obige Änderung des Code erfolgreich zu kompilieren machen würde, kann ich verstehen, den Zweck nicht von Ihre Klasse und ihre Methode.

0

Ihre Funktion gibt immer List<XEntity> zurück, während Sie geschrieben haben, dass List<T> zurückgegeben werden kann. So kann T nicht XEntity sein.

Ich werde Sie raten, diese Klasse generisch zu machen und zurück, es ist T:

internal class XMemory<T> 
{ 
    private List<List<T>> EntityContents { get; set; } = new List<List<T>>(); 

    internal List<T> Read<T>() 
    { 
     var entityContent = EntityContents.FirstOrDefault(); 

     return entityContent; 
    } 
} 
+0

Danke für Ihre Antwort. Ich kann das nicht, weil XMemory den Inhalt vieler verschiedener Objekte speichern soll. Aus diesem Grund habe ich versucht, ein Interface zu verwenden, um allen Objekten ein gemeinsames Element zu geben.Wenn ich diese Änderung mache, kann ich immer nur einen Typ speichern. –

Verwandte Themen