2010-08-02 6 views
5

tôi trở lại một Json'ed loại annonymous:Có cách nào để chỉ định một loại số lượng ẩn danh trống không?

IList<MyClass> listOfStuff = GetListOfStuff(); 

return Json(
    new { 
     stuff = listOfStuff 
    } 
); 

Trong những trường hợp nhất định, tôi biết rằng listOfStuff sẽ trống. Vì vậy, tôi không muốn các chi phí gọi GetListOfStuff() (mà làm cho một cuộc gọi cơ sở dữ liệu).

Vì vậy, trong trường hợp này tôi đang viết:

return Json(
    new { 
     stuff = new List<ListOfStuff>() 
    } 
); 

mà dường như một chút không cần thiết tiết. Tôi không quan tâm loại List đó là, bởi vì nó trống rỗng anyway.

Có cách viết tắt có thể được sử dụng để biểu thị số lượng/danh sách/mảng trống không? Một cái gì đó như:

return Json(
    new { 
     stuff = new [] 
    } 
); 

Hoặc tôi đã lập trình JavaScript quá lâu? :)

+0

Quá nhiều javascript. –

Trả lời

5

Về cơ bản bạn muốn phát ra một mảng trống. C# có thể suy ra kiểu mảng từ các đối số, nhưng đối với các mảng trống, bạn vẫn phải chỉ định kiểu. Tôi đoán cách ban đầu của bạn để làm điều đó là đủ tốt. Hoặc bạn có thể làm điều này:

return Json(
    new { 
     stuff = new ListOfStuff[]{} 
    } 
); 

Loại mảng không thực sự quan trọng như bất kỳ số lượng trống sẽ dịch thành [] trong JSON. Tôi đoán, vì lợi ích dễ đọc, hãy chỉ định loại mảng trống. Bằng cách này khi những người khác đọc mã của bạn, nó rõ ràng hơn những gì mà thành viên được cho là.

+0

+1 để chỉ ra rằng JSON không quan tâm đến loại trong trường hợp này; Tôi không biết điều đó –

-3

Tôi đoán bạn đang nói về C# tại đây. Kiến thức của tôi bị giới hạn trong C# nhưng tôi không nghĩ rằng bạn có thể tạo một đối tượng mới mà không có loại nào. Tại sao bạn không thể trả lại Danh sách mới chung []? (có thể được trộn Java generics ở đây, không chắc chắn là một trong những có thể trở về một danh sách loại chung trong C#).

2

gửi một kiểu generic ?:

List<Object>() 

hoặc gửi một mảng đối tượng rỗng: new Object[0]

2

Bạn có thể không quan tâm những gì loại danh sách đó là, nhưng nó quan trọng đối với người gọi. C# thường không cố gắng suy ra các kiểu dựa trên biến mà nó đang được lưu trữ (giống như bạn không thể tạo quá tải các phương thức trên kiểu trả về), vì vậy cần phải xác định kiểu. Điều đó nói rằng, bạn có thể sử dụng new ListOfStuff[0] nếu bạn muốn một mảng trống trở lại. Điều này có tác dụng là không thay đổi (theo chiều dài) cho người gọi (họ sẽ nhận được ngoại lệ nếu họ cố gắng gọi các phương thức có độ dài thay đổi IList<T>.)

+0

Xem câu trả lời của Igor vì nó chính xác hơn; vì điều này đang trải qua JSON, bất kỳ mảng trống nào là đủ. –

1

Bạn có thể sử dụng Enumerable.Empty để rõ ràng hơn một chút:

return Json(
    new { 
     stuff = Enumerable.Empty<ListOfStuff>() 
    } 
); 

Mặc dù không ngắn hơn và không loại bỏ đối số loại.

0

Có, có. Bạn phải định nghĩa một mảng có ít nhất một phần tử và sử dụng LINQ để lọc mảng không để lại phần tử nào. Ví dụ:

var foo = new 
{ 
    Code = 1, 
    Name = "Bar", 
    Value = (float?)5.0 
}; 

//use an empty object (or any object) to define the type of the array 
var emptyArrayOfFooType = new[] { 
    new 
    { 
     Code = (int)0, 
     Name = (string)null, 
     Value = (float?)null 
    } 
}.Where(e => false).ToArray(); //use linq to filter the array leaving no elements 

//you can use an existing anonymous type variable too 
var anotherEmptyArray = new[] { foo }.Where(e => false).ToArray(); 

//this array with one element has the same type of the previous two arrays 
var fooArray = new[] { foo }; 

//all arrays have the same type, so you can combine them 
var combinedArrays = emptyArrayOfFooType.Concat(anotherEmptyArray).Union(fooArray);