2010-08-02 73 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); 
相关问题