Wie kann ich anonyme Typen als Parameter an andere Funktionen übergeben? Betrachten Sie dieses Beispiel:
var query = from employee in employees select new { Name = employee.Name, Id = employee.Id };
LogEmployees(query);
Die Variable query
hier hat keinen starken Typ. Wie soll ich meine LogEmployees
Funktion definieren , um sie zu akzeptieren?
public void LogEmployees (? list)
{
foreach (? item in list)
{
}
}
Mit anderen Worten, was soll ich anstelle von verwenden ?
Markierungen verwenden.
c#
function
parameters
anonymous-types
Saeed Neamati
quelle
quelle
Antworten:
Ich denke, Sie sollten eine Klasse für diesen anonymen Typ erstellen. Das wäre meiner Meinung nach das Vernünftigste. Aber wenn Sie wirklich nicht wollen, können Sie Dynamik verwenden:
Beachten Sie, dass dies nicht stark typisiert ist. Wenn sich beispielsweise Name in EmployeeName ändert, wissen Sie erst zur Laufzeit, dass ein Problem vorliegt.
quelle
dynamic
Verwendung als richtige Antwort überprüft . Ich habe mich wirklich als nützlich erwiesen. Danke :)Sie können es so machen:
... aber Sie werden nicht viel mit jedem Gegenstand anfangen können. Sie könnten ToString nennen, aber Sie werden nutzen können (sagen wir) nicht
Name
undId
direkt.quelle
where T : some type
am Ende der ersten Zeile verwenden, um den Typ einzugrenzen. Zu diesem Zeitpunkt wäre es jedoch sinnvoller, eine bestimmte Art von gemeinsamer Schnittstelle zu erwarten, um eine Schnittstelle zu erwarten. :)where T : some type
mit anonymen Typen verwenden, da sie keine Schnittstelle implementieren ...Leider ist das, was Sie versuchen, unmöglich. Unter der Haube wird die Abfragevariable
IEnumerable
als anonymer Typ eingegeben . Anonyme Typnamen können nicht im Benutzercode dargestellt werden, daher gibt es keine Möglichkeit, sie zu einem Eingabeparameter für eine Funktion zu machen.Am besten erstellen Sie einen Typ und verwenden diesen als Rückgabe aus der Abfrage und übergeben ihn dann an die Funktion. Beispielsweise,
In diesem Fall wählen Sie jedoch nur ein einzelnes Feld aus, sodass es möglicherweise einfacher ist, das Feld direkt auszuwählen. Dadurch wird die Abfrage als Feldtyp eingegeben
IEnumerable
. In diesem Fall Spaltenname.quelle
Equals
Verhalten geändert wird. Dh du musst es implementieren. (Ich wusste von dieser Diskrepanz, konnte sie aber während eines Refactorings immer noch vergessen.)Sie können einen anonymen Typ nicht an eine nicht generische Funktion übergeben, es sei denn, der Parametertyp ist
object
.Anonyme Typen sind für die kurzfristige Verwendung innerhalb einer Methode vorgesehen.
Von MSDN - Anonyme Typen :
(Hervorhebung von mir)
Aktualisieren
Sie können Generika verwenden, um das zu erreichen, was Sie wollen:
quelle
object
- ordynamic
; pobject
ist nicht das Gleiche wie eine generische Methode im anonymen Typ gemäß meiner Antwort.Normalerweise tun Sie dies mit Generika, zum Beispiel:
Der Compiler sollte dann
T
beim Aufrufen auf das schließenMapEntToObj(query)
. Ich bin mir nicht ganz sicher, was Sie innerhalb der Methode tun möchten, daher kann ich nicht sagen, ob dies nützlich ist. Das Problem ist, dassMapEntToObj
Sie die Methode immer noch nicht benennen könnenT
- Sie können auch:T
T
, um Dinge zu tunAnsonsten ist es ziemlich schwierig, anonyme Typen zu manipulieren - nicht zuletzt, weil sie unveränderlich sind ;-p
Ein weiterer Trick (beim Extrahieren von Daten) besteht darin, auch einen Selektor zu übergeben - dh so etwas wie:
quelle
Sie können Generika mit dem folgenden Trick verwenden (Casting in einen anonymen Typ):
quelle
Zu diesem Zweck kann auch "dynamisch" verwendet werden.
quelle
Anstatt einen anonymen Typ zu übergeben, übergeben Sie eine Liste eines dynamischen Typs:
var dynamicResult = anonymousQueryResult.ToList<dynamic>();
DoSomething(List<dynamic> _dynamicResult)
DoSomething(dynamicResult);
Vielen Dank an Petar Ivanov !
quelle
Wenn Sie wissen, dass Ihre Ergebnisse eine bestimmte Schnittstelle implementieren, können Sie die Schnittstelle als Datentyp verwenden:
quelle
Ich würde
IEnumerable<object>
als Typ für das Argument verwenden. Allerdings kein großer Gewinn für die unvermeidliche explizite Besetzung. Prostquelle