2013-08-19 34 views
5

tôi cần làm một cái gì đó như thế này:Đi qua đối tượng của loại vô danh như tham số để một phương pháp

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) 
} 

tôi cần phải vượt qua queryResult biến hoạt doSomething(). Tôi đã cố gắng sử dụng một loại năng động, List<T> đối tượng, nhưng không làm việc

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

Trong phòng thu trực quan, bạn có thể di chuột qua từ khóa 'var' để xem loại kết quả được tạo. – lukegravitt

Trả lời

10

Nói chung, đó là gần như luôn luôn là một ý tưởng tồi để vượt qua các loại vô danh giữa các phương pháp.

Bạn nên tạo loại tùy chỉnh để giữ các giá trị nomeid, sau đó xây dựng nó thay vì loại ẩn danh.


Trong trường hợp của bạn, bạn đã có một lớp học hoạt động: carros. Bạn chỉ có thể thực hiện truy vấn của bạn để tạo ra nó thay vì:

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

phương pháp của bạn sau đó sẽ là:

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

Bạn có thể giải thích tại sao đây là một ý tưởng tồi không? Anh ta có một đối tượng đã được gọi là 'Carros' có 'nome' và' id' – itanex

+0

bạn có thể giải thích? –

+3

@FelipeMaricatoMoura: Lý do đó là một ý tưởng tồi vì loại ẩn danh mà bạn đã tạo là * nặc danh *. Đó là: không có cách nào để xây dựng nó bên ngoài truy vấn LINQ nơi nó được sử dụng (bên ngoài hackery phản chiếu). Là hữu ích như các loại vô danh, chúng được giới hạn một cách hợp lý trong phạm vi của phương thức ban đầu của chúng. Nếu bạn muốn vượt qua chúng, chúng rõ ràng có sự liên quan vượt ra ngoài phạm vi ban đầu và do đó, xứng đáng với tên và tuyên bố. –

2

Bạn không thể vượt qua các kiểu nặc danh * nằm ngoài phạm vi của phương pháp hiện hành. Sử dụng carros kiểu của bạn:

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 />"); 
    } 
} 

* Bạn có thể vượt qua chúng chỉ như là một object mà chủ yếu là vô ích vì bạn sẽ muốn sử dụng chúng theo cách mạnh mẽ, đánh máy.

+0

không hoạt động doSomething (qry) dòng hiển thị lỗi –

+0

Bạn có thể chia sẻ lỗi biên dịch không? –

+0

xin lỗi hoạt động tốt bằng cách sử dụng một selec q; nhưng không hoạt động đối với các loại xe mới được chọn {q.nome, q.id}; hoặc chọn {q.nome, q.id} mới; bạn có biết gì không? –

2

Tại sao không khai báo đối tượng mới dưới dạng loại ô tô?

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

tham số của bạn sau đó sẽ: bạn

IEnumerable{carros} 
+0

Hoặc chỉ cần 'chọn q' – Magnus

+0

không làm việc carros mới {} hiển thị một erros trong từ mới –

+0

Erro: Lỗi 'testeLINQ.carros' không chứa hàm tạo 0 đối số –

3

Chỉ muốn kêu vang trong liên quan đến thông qua các loại vô danh, trong khi nó đang được đề cập rằng juju xấu của nó để vượt qua anonmyous loại, có thể ... nếu bạn thực sự muốn (tận dụng năng động)

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

    AnonReciever(x); 
} 

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

Và điều này in bar không có vấn đề gì.

Tôi không khuyên bạn nên làm điều đó. Tốt nhất để sử dụng một đối tượng đã nhập tùy chỉnh mà bạn đã có.

+0

không hoạt động lỗi hiển thị động "không thể tìm thấy động lực vùng tên" –

+0

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

Các vấn đề liên quan