Ich habe eine Abfrage, die einen anonymen Typ zurückgibt, und die Abfrage befindet sich in einer Methode. Wie schreibst du das:
public "TheAnonymousType" TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return "TheAnonymousType";
}
}
c#
.net
anonymous-types
return-type
frenchie
quelle
quelle
Antworten:
Das kannst du nicht.
Sie können nur zurückkehren
object
, oder Container von Objekten, zBIEnumerable<object>
,IList<object>
usw.quelle
dynamic
. Das macht es etwas einfacher, damit zu arbeiten.Sie können zurückkehren,
dynamic
wodurch Sie eine zur Laufzeit überprüfte Version des anonymen Typs erhalten, jedoch nur in .NET 4+quelle
In C # 7 können wir Tupel verwenden, um dies zu erreichen:
Möglicherweise müssen Sie jedoch das
System.ValueTuple
Nuget-Paket installieren .quelle
Sie können keine anonymen Typen zurückgeben. Können Sie ein Modell erstellen, das zurückgegeben werden kann? Andernfalls müssen Sie eine verwenden
object
.Hier ist ein Artikel von Jon Skeet zu diesem Thema
Code aus dem Artikel:
Oder hier ist ein anderer ähnlicher Artikel
Oder, wie andere kommentieren, könnten Sie verwenden
dynamic
quelle
Sie können die Tuple-Klasse als Ersatz für anonyme Typen verwenden, wenn eine Rückgabe erforderlich ist:
Hinweis: Tupel kann bis zu 8 Parameter haben.
Oder für das Beispiel aus dem ursprünglichen Beitrag:
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
quelle
Der C # -Compiler ist ein Zwei-Phasen-Compiler. In der ersten Phase werden nur Namespaces, Klassenhierarchien, Methodensignaturen usw. überprüft. Methodenkörper werden nur in der zweiten Phase kompiliert.
Anonyme Typen werden erst ermittelt, wenn der Methodenkörper kompiliert wurde.
Der Compiler hat also in der ersten Phase keine Möglichkeit, den Rückgabetyp der Methode zu bestimmen.
Aus diesem Grund können anonyme Typen nicht als Rückgabetyp verwendet werden.
Wie andere vorgeschlagen haben, können Sie verwenden, wenn Sie .net 4.0 oder eine Reibe verwenden
Dynamic
.Wenn ich Sie wäre, würde ich wahrscheinlich einen Typ erstellen und diesen Typ von der Methode zurückgeben. Auf diese Weise ist es für zukünftige Programmierer, die Ihren Code pflegen und leichter lesbar sind, einfach.
quelle
Drei Optionen:
Option 1:
Option 2:
Sie können es als Objekt iterieren
Option 3:
und Sie können es als dynamisches Objekt iterieren und direkt auf deren Eigenschaften zugreifen
quelle
In diesem Fall können Sie eine Liste von Objekten zurückgeben.
quelle
Mit C # 7.0 können wir immer noch keine anonymen Typen zurückgeben, aber wir unterstützen Tupeltypen und können daher eine Sammlung von
tuple
(System.ValueTuple<T1,T2>
in diesem Fall) zurückgeben. DerzeitTuple types
werden sie in Ausdrucksbäumen nicht unterstützt und Sie müssen Daten in den Speicher laden.Die kürzeste Version des gewünschten Codes sieht möglicherweise folgendermaßen aus:
Oder verwenden Sie die fließende Linq-Syntax:
Mit C # 7.1 können wir die Eigenschaftsnamen von Tupeln weglassen und sie werden aus der Tupelinitialisierung abgeleitet, wie es bei anonymen Typen funktioniert:
quelle
Das Erstellen einer eigenen Klasse und das Abfragen danach ist die beste Lösung, die ich kenne. Soweit ich weiß, können Sie in einer anderen Methode keine Rückgabewerte für anonyme Typen verwenden, da diese nicht nur erkannt werden. Sie können jedoch in derselben Methode verwendet werden Methode. Früher habe ich sie als
IQueryable
oder zurückgegebenIEnumerable
, obwohl Sie immer noch nicht sehen können, was sich in der anonymen Typvariablen befindet.Ich bin schon einmal auf so etwas gestoßen, als ich versucht habe, Code umzugestalten. Sie können dies hier überprüfen: Umgestalten und Erstellen separater Methoden
quelle
Mit Reflexion.
Stichprobe:
Ausgabe:
quelle
Sie können nur das dynamische Schlüsselwort verwenden.
Mit dem Schlüsselwort "dynamischer Typ" verlieren Sie jedoch die Sicherheit der Kompilierungszeit, IDE IntelliSense usw.
quelle
Eine andere Option könnte die Verwendung von Automapper sein: Sie konvertieren von Ihrem anonymen zurückgegebenen Objekt in einen beliebigen Typ, solange die öffentlichen Eigenschaften übereinstimmen. Die wichtigsten Punkte sind: Objekt zurückgeben, Linq und Autommaper verwenden. (oder verwenden Sie eine ähnliche Idee, um serialisierten JSON usw. zurückzugeben, oder verwenden Sie Reflection.)
quelle
Jetzt besonders mit lokalen Funktionen, aber Sie können dies immer tun, indem Sie einen Delegaten übergeben, der den anonymen Typ erstellt.
Wenn es also Ihr Ziel war, unterschiedliche Logik auf denselben Quellen auszuführen und die Ergebnisse in einer einzigen Liste zu kombinieren. Sie sind sich nicht sicher, welche Nuance dies fehlt, um das angegebene Ziel zu erreichen. Solange Sie jedoch a zurückgeben
T
und einen Delegaten übergeben,T
können Sie einen anonymen Typ von einer Funktion zurückgeben.quelle
Es ist tatsächlich möglich, einen anonymen Typ von einer Methode in einem bestimmten Anwendungsfall zurückzugeben. Werfen wir einen Blick!
Mit C # 7 ist es möglich, anonyme Typen von einer Methode zurückzugeben, obwohl dies mit einer geringfügigen Einschränkung verbunden ist. Wir werden eine neue Sprachfunktion namens lokale Funktion zusammen mit einem Indirektionstrick verwenden (eine andere Indirektionsebene kann jede Programmieraufgabe lösen, oder?).
Hier ist ein Anwendungsfall, den ich kürzlich identifiziert habe. Ich möchte alle Konfigurationswerte protokollieren, nachdem ich sie von geladen habe
AppSettings
. Warum? Weil es eine Logik für fehlende Werte gibt, die auf Standardwerte zurückgesetzt werden, einige Parsing und so weiter. Eine einfache Möglichkeit, die Werte nach dem Anwenden der Logik zu protokollieren, besteht darin, sie alle in eine Klasse einzuteilen und in eine Protokolldatei zu serialisieren (mithilfe von log4net). Ich möchte auch die komplexe Logik des Umgangs mit Einstellungen zusammenfassen und diese von allem trennen, was ich damit tun muss. Alles ohne eine benannte Klasse zu erstellen, die nur für einen einzigen Gebrauch existiert!Mal sehen, wie man dies mit einer lokalen Funktion löst, die einen anonymen Typ erstellt.
Es ist mir gelungen, eine anonyme Klasse zu erstellen, und ich habe auch die Logik des Umgangs mit der Verwaltung komplexer Einstellungen in
CreateHttpClient
und innerhalb ihres eigenen "Ausdrucks" zusammengefasst. Dies ist möglicherweise nicht genau das, was das OP wollte, aber es ist ein leichtgewichtiger Ansatz mit anonymen Typen, der derzeit in modernem C # möglich ist.quelle