Mam zapytanie, które zwraca typ anonimowy, a zapytanie jest w metodzie. Jak to piszesz:
public "TheAnonymousType" TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return "TheAnonymousType";
}
}
c#
.net
anonymous-types
return-type
Francuz
źródło
źródło
Odpowiedzi:
Nie możesz.
Można jedynie zwrócić
object
lub pojemnik z przedmiotami, na przykładIEnumerable<object>
,IList<object>
itdźródło
dynamic
. To sprawia, że praca z nim jest nieco łatwiejsza.Możesz zwrócić,
dynamic
co da ci sprawdzoną w czasie wykonywania wersję typu anonimowego, ale tylko w .NET 4+źródło
W C # 7 możemy użyć krotek, aby to osiągnąć:
Może być jednak konieczne zainstalowanie
System.ValueTuple
pakietu NuGet.źródło
Nie możesz zwrócić typów anonimowych. Czy możesz stworzyć model, który można zwrócić? W przeciwnym razie musisz użyć pliku
object
.Oto artykuł napisany na ten temat przez Jona Skeeta
Kod z artykułu:
Albo tutaj jest inny podobny artykuł
Lub, jak komentują inni, możesz użyć
dynamic
źródło
Możesz użyć klasy Tuple jako substytutu dla typów anonimowych, gdy konieczne jest zwrócenie:
Uwaga: krotka może mieć maksymalnie 8 parametrów.
Lub na przykład z oryginalnego postu:
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
źródło
Kompilator C # jest kompilatorem dwufazowym. W pierwszej fazie sprawdza tylko przestrzenie nazw, hierarchie klas, sygnatury metod itp. Treści metod są kompilowane dopiero w drugiej fazie.
Typy anonimowe nie są określane do momentu skompilowania treści metody.
Dlatego kompilator nie ma możliwości określenia zwracanego typu metody w pierwszej fazie.
To jest powód, dla którego typy anonimowe nie mogą być używane jako typ zwracany.
Jak sugerowali inni, jeśli używasz .net 4.0 lub tarki, możesz użyć
Dynamic
.Na twoim miejscu prawdopodobnie utworzyłbym typ i zwróciłbym ten typ z metody. W ten sposób jest to łatwe dla przyszłych programistów, którzy dbają o Twój kod i są bardziej czytelni.
źródło
Trzy opcje:
Opcja 1:
Opcja 2:
możesz iterować go jako obiekt
Opcja 3:
i będziesz mógł iterować go jako obiekt dynamiczny i uzyskać bezpośredni dostęp do jego właściwości
źródło
W takim przypadku możesz zwrócić listę obiektów.
źródło
Używając C # 7.0 nadal nie możemy zwracać typów anonimowych, ale mamy obsługę typów krotek, a zatem możemy zwrócić kolekcję
tuple
(System.ValueTuple<T1,T2>
w tym przypadku). ObecnieTuple types
nie są obsługiwane w drzewach wyrażeń i musisz załadować dane do pamięci.Najkrótsza wersja żądanego kodu może wyglądać następująco:
Lub używając płynnej składni Linq:
Używając C # 7.1 możemy pominąć nazwy właściwości krotki i zostaną one wywnioskowane z inicjalizacji krotki, tak jak to działa z typami anonimowymi:
źródło
Stworzenie własnej klasy i odpytywanie o nią to najlepsze rozwiązanie jakie znam, o ile wiem, nie można użyć wartości zwracanych typu anonimowego w innej metodzie, ponieważ nie będą one tylko rozpoznawane, ale mogą być używane w tym samym metoda. Zwracałem je jako
IQueryable
lubIEnumerable
, chociaż nadal nie pozwala ci zobaczyć, co znajduje się wewnątrz zmiennej typu anonimowego.Wcześniej napotkałem coś takiego, gdy próbowałem refaktoryzować kod, możesz to sprawdzić tutaj: Refaktoryzacja i tworzenie oddzielnych metod
źródło
Z refleksją.
Próba:
Wynik:
źródło
Możesz używać tylko dynamicznych słów kluczowych,
Ale dzięki słowu kluczowemu typu dynamicznego stracisz bezpieczeństwo czasu kompilacji, IDE IntelliSense itp.
źródło
Inną opcją może być użycie automappera: będziesz konwertować na dowolny typ z anonimowego zwróconego obiektu, o ile będą pasować długie właściwości publiczne. Kluczowe punkty to zwracanie obiektu, użycie linq i autommaper. (lub użyj podobnego pomysłu, zwracając zserializowany plik JSON itp. lub użyj odbicia)
źródło
Teraz szczególnie z funkcjami lokalnymi, ale zawsze możesz to zrobić, przekazując delegata, który tworzy anonimowy typ.
Więc jeśli twoim celem było uruchomienie różnych logiki na tych samych źródłach i możliwość łączenia wyników w jedną listę. Nie jestem pewien, jakiego niuansu brakuje, aby osiągnąć określony cel, ale tak długo, jak zwracasz a
T
i przekazujesz delegata do wykonaniaT
, możesz zwrócić anonimowy typ z funkcji.źródło
W rzeczywistości możliwe jest zwrócenie anonimowego typu z metody w określonym przypadku użycia. Spójrzmy!
W języku C # 7 możliwe jest zwrócenie anonimowych typów z metody, chociaż wiąże się to z niewielkimi ograniczeniami. Zamierzamy użyć nowej funkcji języka zwanej funkcją lokalną wraz ze sztuczką pośredniczącą (kolejna warstwa pośrednictwa może rozwiązać każde wyzwanie programistyczne, prawda?).
Oto przypadek użycia, który niedawno zidentyfikowałem. Chcę rejestrować wszystkie wartości konfiguracyjne po ich załadowaniu z
AppSettings
. Czemu? Ponieważ istnieje pewna logika dotycząca brakujących wartości, które powracają do wartości domyślnych, trochę analizy i tak dalej. Łatwym sposobem rejestrowania wartości po zastosowaniu logiki jest umieszczenie ich wszystkich w klasie i serializowanie ich do pliku dziennika (przy użyciu log4net). Chcę też ująć złożoną logikę postępowania z ustawieniami i oddzielić to od tego, co muszę z nimi zrobić. Wszystko to bez tworzenia nazwanej klasy, która istnieje tylko do jednorazowego użytku!Zobaczmy, jak rozwiązać ten problem, używając funkcji lokalnej, która tworzy typ anonimowy.
Udało mi się skonstruować anonimową klasę, a także zawrzeć logikę radzenia sobie ze złożonym zarządzaniem ustawieniami, wszystko wewnątrz
CreateHttpClient
i wewnątrz jego własnego „wyrażenia”. To może nie być dokładnie to, czego chciał OP, ale jest to lekkie podejście z typami anonimowymi, które jest obecnie możliwe w nowoczesnym C #.źródło