2010-08-02 72 views
5

我返回Json'ed annonymous類型:有沒有辦法指定一個匿名的空可枚舉類型?

IList<MyClass> listOfStuff = GetListOfStuff(); 

return Json(
    new { 
     stuff = listOfStuff 
    } 
); 

在某些情況下,我知道listOfStuff將是空的。所以我不希望調用GetListOfStuff()(這使得數據庫調用)的開銷。

因此,在這種情況下,我正在寫:

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

這似乎有點不必要的冗長。我不在乎它是什麼類型的List,因爲它無論如何都是空的。

有沒有可以用來表示空的enumerable/list/array的簡寫?例如:

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

或者我一直在編程JavaScript太久了? :)

+0

太多的JavaScript。 – 2010-08-02 22:48:43

回答

5

基本上你想發出一個空的數組。 C#可以從參數中推斷數組類型,但對於空數組,您仍然需要指定類型。我想你原來的做法足夠好。或者你可以這樣做:

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

類型的數組其實並不重要因爲任何空枚舉將在JSON轉化爲[]。我想,爲了可讀性,請指定空數組的類型。這樣當其他人閱讀你的代碼時,這個成員應該是什麼更明顯。

+0

+1表示JSON不關心這種情況下的類型;我沒有意識到這一點 – 2010-08-03 00:15:31

-3

我想你在談論C#在這裏。我的知識在C#中是有限的,但我不認爲你可以創建一個沒有類型的新對象。爲什麼你不能返回一個通用的新List []? (可能是在這裏混合使用Java泛型,我不確定是否可以返回C#中的泛型類型列表)。

2

發送一個泛型類型?:

List<Object>() 

或發送一個空的對象數組:new Object[0]

2

您可能並不關心它是什麼類型的列表,但它很重要給調用者。 C#通常不會嘗試根據它所存儲的變量來推斷類型(就像不能在返回類型上創建方法的重載一樣),所以有必要指定類型。也就是說,如果你想返回一個空數組,你可以使用new ListOfStuff[0]。這具有(長)不可改變給調用者的影響(如果他們試圖調用長度變異IList<T>方法,他們會得到一個異常。)

+0

請看伊戈爾的答案,因爲它更正確;因爲這是通過JSON,所以任何空數組就足夠了。 – 2010-08-03 00:14:59

1

你可以使用Enumerable.Empty是一個小更明確:

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

雖然它不短,並沒有擺脫類型的參數。

0

是的,有。你必須定義一個至少有一個元素的數組,並使用linq來過濾沒有元素的數組。例如:

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); 
相關問題