2013-08-19 21 views
5

muszę zrobić coś takiego:Przechodząc obiekt typu anonimowego jako parametru do metody

public class carros 
{ 
    public int id { get; set; } 
    public string nome { get; set; } 
} 

public void listar_carros() 
{ 
    List<carros> cars = new List<carros>(); 
    cars.Add(new carros{ id= 1, nome = "Fusca" }); 
    cars.Add(new carros{ id= 2, nome = "Gol" }); 
    cars.Add(new carros{ id= 3, nome = "Fiesta" }); 

    var queryResult = from q in cars 
         where q.nome.ToLower().Contains("eco") 
         orderby q.nome 
         select new { q.nome, q.id }; 

    doSomething(queryResult) 
} 

muszę przekazać zmienną queryResult funkcjonować doSomething(). Próbowałem użyć dynamicznego typu, List<T> obiekt, ale nic nie działa

public void doSomething(???? queryResult) 
{ 
    foreach (carros ca in queryResult) 
    { 
     Response.Write(ca.nome); 
     Response.Write(" - "); 
     Response.Write(ca.id); 
    } 
} 
+1

W studio graficznym można umieścić wskaźnik myszy nad słowem kluczowym 'var', aby zobaczyć typ wygenerowanego wyniku. – lukegravitt

Odpowiedz

10

W ogóle, to prawie zawsze jest to zły pomysł, aby przechodzić między anonimowych typów metod.

Powinieneś utworzyć niestandardowy typ, aby zachować wartości nome i id, a następnie skonstruuj go zamiast typu anonimowego.


W twoim przypadku, masz już klasę, która będzie działać: carros. Można po prostu wdrożyć zapytanie go utworzyć zamiast:

var queryResult = from q in cars 
    where q.nome.ToLower().Contains("eco") 
    orderby q.nome 
    select new carros {q.nome, q.id}; 

Twoja metoda byłaby wtedy:

public void doSomething(IEnumerable<carros> queryResults) 
+0

Czy możesz wyjaśnić, dlaczego to zły pomysł? Ma obiekt o nazwie 'Carros', który ma' nome' i 'id' – itanex

+0

czy możesz wyjaśnić? –

+3

@FelipeMaricatoMoura: Powodem tego jest zły pomysł, ponieważ anonimowy typ, który utworzyłeś, jest * anonimowy *. Oznacza to, że: nie ma sposobu na skonstruowanie go poza kwerendą LINQ, w której był on używany (poza hackery refleksji). Tak pomocne, jak typy anonimowe, są słusznie ograniczone w zakresie do ich metody początkowej. Jeśli chcesz je przekazać, mają one oczywiście znaczenie poza tym początkowym zakresem i dlatego zasługują na imię i deklarację. –

2

Nie można przekazać anonimowo rodzaje * poza zakresem obecnego sposobu. Użyj typ carros:

public void listar_carros() 
{ 
    List<carros> Lcars = new List<carros>(); 
    Lcars.Add(new carros(1, "Fusca")); 
    Lcars.Add(new carros(2, "Gol")); 
    Lcars.Add(new carros(3, "Fiesta")); 

    var qry = from q in Lcars 
       where q.nome.ToLower().Contains("eco") 
       orderby q.nome 
       select q; 

    doSomething(qry); 

} 

public void doSomething(IEnumerable<carros> qry) 
{ 

    foreach (carros ca in qry) 
    { 
     Response.Write(ca.nome); 
     Response.Write(" - "); 
     Response.Write(ca.id); 
     //Response.Write(ca); 
     Response.Write("<br />"); 
    } 
} 

* Można przekazać je tylko jako object która jest przeważnie bezużyteczny, ponieważ co chcesz ich używać w silnym wpisany sposób.

+0

Nie działa do Zrób coś (qry) linia pokazuje błąd –

+0

Czy możesz udostępnić błąd kompilacji? –

+0

Przepraszam działa dobrze przy użyciu selec q; ale nie działa dla wybranych nowych samochodów {q.nome, q.id}; lub wybierz nowy {q.nome, q.id}; wiesz co? –

2

Dlaczego nie zadeklarować nowego obiektu jako typu carros?

var qry = from q in Lcars 
      where q.nome.ToLower().Contains("eco") 
      orderby q.nome 
      select new carros {q.nome, q.id}; 

Twój parametr będzie wtedy:

IEnumerable{carros} 
+0

lub po prostu 'wybrać q' – Magnus

+0

nie działają nowe Carros {} pokazać erros w nowym słowem –

+0

erro: Błąd "testeLINQ.carros" nie zawiera konstruktora, który przyjmuje 0 argumentów –

3

Chciałem tylko kurant dotyczące przechodzenia anonimowych typów, a to zostało wspomniane, że jego złe juju przekazać anonmyous typów, można ... Jeśli naprawdę chciał (wykorzystując dynamikę)

public void Anon() 
{ 
    var x = new {foo = "bar"}; 

    AnonReciever(x); 
} 

public static void AnonReciever(dynamic o) 
{ 
    Console.WriteLine(o.foo); 
} 

I to drukuje bar bez problemu.

Nie polecam tego jednak. Najlepiej użyć niestandardowego wpisanego obiektu, który już masz.

+0

nie działa dynamiczny błąd show "nie można znaleźć dynamicznej przestrzeni nazw" –

+0

http://stackoverflow.com/a/14760410/310196 – devshorts

Powiązane problemy