2009-08-25 23 views
43

Tôi biết tôi không thể viết một phương pháp như:Có cách nào để trả lại Loại Ẩn danh từ phương pháp không?

public var MyMethod() 
{ 
    return new{ Property1 = "test", Property2="test"}; 
} 

tôi có thể làm điều đó bằng cách khác:

public object MyMethod() 
{ 
    return new{ Property1 = "test", Property2="test"} 
} 

nhưng tôi không muốn làm tùy chọn thứ hai bởi vì, nếu tôi làm như vậy , Tôi sẽ phải sử dụng sự phản chiếu.


Tại sao tôi muốn làm điều đó:

Hôm nay tôi có một phương pháp bên trong trang aspx của tôi mà trả về một DataTable như kết quả và tôi không thể thay đổi nó, tôi đã cố gắng để chuyển đổi DataTable này để một Phương pháp ẩn danh với các thuộc tính mà tôi muốn làm việc. Tôi không muốn tạo ra một lớp chỉ để làm điều đó và vì tôi sẽ cần phải thực hiện cùng một truy vấn nhiều lần, tôi nghĩ rằng để tạo ra một phương thức trả về một kiểu vô danh sẽ là một ý thức tốt.

+0

Bạn sẽ sử dụng nó để làm gì? Làm thế nào bạn đi đến kết luận rằng bạn sẽ muốn làm một cái gì đó như thế? – Guffa

+0

@Guffa, tôi có một phương thức bên trong trang aspx của tôi trả về một kết quả có thể định dạng được, tôi đã cố chuyển đổi dữ liệu này thành một phương thức ẩn danh với các thuộc tính mà tôi muốn làm việc. Tôi không muốn tạo ra một lớp chỉ để làm điều đó và vì tôi sẽ cần phải thực hiện cùng một truy vấn nhiều lần, tôi đã tạo ra một phương thức trả về một phương thức nặc danh sẽ là một ý thức tốt. – Cleiton

+1

@Cleiton - sẽ tốn ít công sức hơn để tạo một lớp để chứa dữ liệu. Tôi đã nhận ra rằng chỉ vì tôi có thể sử dụng các kiểu ẩn danh để thao tác dữ liệu một cách dễ dàng, điều đó không có nghĩa là tôi nên ngừng tạo các lớp để định nghĩa các kiểu khi tôi cần truyền chúng từ lớp này sang lớp khác. – Jagd

Trả lời

57

Trả lại dưới dạng System.Objectchỉ cách cách trả về loại ẩn danh từ phương thức. Thật không may là không có cách nào khác để làm điều này vì các loại vô danh được thiết kế đặc biệt để ngăn chặn việc sử dụng chúng theo cách này.

Có một số thủ thuật mà bạn có thể làm để kết hợp với việc trả lại số Object cho phép bạn đến gần. Nếu bạn quan tâm đến cách giải quyết này, vui lòng đọc Can't return anonymous type from method? Really?.

Tuyên bố từ chối trách nhiệm: Mặc dù bài viết tôi liên kết không hiển thị cách giải quyết khác không có nghĩa là bạn nên làm điều đó. Tôi mạnh mẽ sẽ không khuyến khích bạn sử dụng phương pháp này khi tạo một loại thông thường sẽ an toàn hơn và dễ hiểu hơn.

+10

Cần lưu ý rằng đây không phải là ý tưởng được đề nghị . Intellisense sẽ không còn nhận ra các thuộc tính được đánh máy mạnh mẽ của loại ẩn danh (Property1 và Property2 từ ví dụ của bạn). Trên thực tế, bạn có thể sử dụng sự phản chiếu để có được các thuộc tính, nhưng bạn cũng có thể đánh ngón tay cái của bạn bằng búa cho tất cả công việc bạn đang đưa vào đó, và chưa kể bạn vừa lấy một thứ được cho là làm cho cuộc sống của bạn dễ dàng hơn , nhưng thực ra đã làm cho nó khó hơn. – Jagd

+0

+1 không thể tự nói tốt hơn. Có, nó có thể được thực hiện, nhưng điều đó không có nghĩa là một ý tưởng hay. –

+0

Nó có thể được thực hiện! _Đó chỉ là một p.i.t.a._ –

1

Không, các loại ẩn danh không thể tồn tại bên ngoài ngữ cảnh mà chúng được tạo và kết quả không thể được sử dụng làm loại trả về phương thức. Bạn có thể trả về cá thể dưới dạng object, nhưng bạn nên tạo rõ ràng loại vùng chứa của riêng mình cho mục đích này.

0

Xin lỗi, bạn thực sự không được phép làm điều đó. Bạn có thể hack xung quanh nó với sự phản ánh hoặc bằng cách thực hiện một phương thức trợ giúp chung để trả lại kiểu cho bạn, nhưng làm như vậy thực sự làm việc chống lại ngôn ngữ. Chỉ cần khai báo loại để nó rõ ràng những gì đang xảy ra.

2

Tôi nghĩ Andrew Hare đã đúng, bạn phải chỉ trả lại "đối tượng". Đối với một bình luận biên tập, tôi cảm thấy như đối phó với các đối tượng thô trong mã OO có thể là một "mã mùi". Có những trường hợp mà nó là điều đúng để làm, nhưng hầu hết thời gian, bạn nên tốt hơn việc xác định một giao diện để trả về, hoặc sử dụng một số loại kiểu cơ sở, nếu bạn định trả về các kiểu liên quan.

1

Không, không có hỗ trợ để mở rộng phạm vi của lớp ẩn danh bên ngoài phương pháp. Bên ngoài phương thức, lớp thực sự vô danh, và sự phản chiếu là cách duy nhất để truy cập vào các thành viên của nó.

13

Giải pháp đơn giản nhất là tạo một lớp, đẩy giá trị vào thuộc tính và sau đó trả về. Nếu các loại vô danh làm cho cuộc sống của bạn trở nên khó khăn hơn thì bạn không sử dụng chúng một cách chính xác.

13
public object MyMethod() 
{ 
    return new 
    { 
     Property1 = "test", 
     Property2 = "test" 
    }; 
} 

static void Main(..) 
{ 
    dynamic o = MyMethod(); 
    var p1 = o.Property1; 
    var p2 = o.Property2; 
} 
21

Hoặc, bạn có thể sử dụng lớp Tuple trong .NET 4.0 và cao hơn:

http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx

Tuple<string, string> Create() 
{ 
return Tuple.Create("test1", "test2"); 
} 

sau đó bạn có thể truy cập vào các tính chất như thế này:

var result = Create(); 
result.Item1; 
result.Item2; 
+8

Vui nhộn. Tôi đến đây tìm kiếm một giải pháp thay thế cho việc sử dụng các bộ dữ liệu như các kiểu trả về. – SixOThree

6

Mặc dù có những lời cảnh báo về việc liệu đây là một ý tưởng tốt hay không ... Một dynamic dường để làm việc tốt cho một phương pháp riêng.

private dynamic MyMethod() 
{ 
    return new { Property1 = "test", Property2 = "test" } 
} 
+0

Tôi nghĩ rằng nó không phải là tốt nhất, vì năng động sẽ xây dựng thành mọi loại dữ liệu, bao gồm cả đối tượng, vì vậy bạn sẽ tốt hơn với đối tượng, với chi phí thấp hơn. – MrKekson

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