2010-08-02 20 views
5

Voy a devolver un tipo Json'ed annonymous:¿Hay alguna forma de especificar un tipo enumerable vacío anónimo?

IList<MyClass> listOfStuff = GetListOfStuff(); 

return Json(
    new { 
     stuff = listOfStuff 
    } 
); 

En ciertos casos, sé que listOfStuff estará vacía. Así que no quiero la sobrecarga de llamar al GetListOfStuff() (que hace una llamada a la base de datos).

Así que en este caso estoy escribiendo:

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

que parece un poco innecesariamente prolijo. No me importa qué tipo de List sea, porque de todos modos está vacío.

¿Hay una abreviatura que se pueda usar para indicar enumerable/list/array vacío? Algo como:

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

¿O he estado programando JavaScript demasiado tiempo? :)

+0

Demasiada javascript. –

Respuesta

5

Básicamente, desea emitir una matriz vacía. C# puede inferir el tipo de matriz a partir de los argumentos, pero para las matrices vacías, aún debe especificar el tipo. Supongo que tu manera original de hacerlo es lo suficientemente buena. O bien, podría hacer esto:

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

El tipo de la matriz no tiene demasiada importancia ya cualquier enumerables vacío se traducirá en [] en JSON. Supongo que, por razones de legibilidad, especifique el tipo de la matriz vacía. De esta forma, cuando otros leen tu código, es más obvio lo que se supone que es ese miembro.

+0

+1 para señalar que a JSON no le importa el tipo en este caso; Yo no estaba al tanto de eso –

-3

Supongo que estás hablando de C# aquí. Mi conocimiento es limitado en C# pero no creo que puedas crear un nuevo objeto sin ningún tipo de letra. ¿Por qué no puedes devolver una nueva lista genérica []? (Podría estar mezclando genéricos de Java aquí, no estoy seguro de que uno pueda devolver una lista de tipos genéricos en C#).

2

enviar un tipo genérico ?:

List<Object>() 

o enviar un array objeto vacío: new Object[0]

2

Es posible que no importa qué tipo de lista que es, pero es importante para la persona que llama. C# generalmente no intenta inferir tipos en función de la variable a la que se almacena (al igual que no puede crear sobrecargas de métodos en el tipo de devolución), por lo que es necesario especificar el tipo. Dicho esto, puede usar new ListOfStuff[0] si desea que se devuelva un conjunto vacío. Esto tiene el efecto de ser inmutable (de longitud) a la persona que llama (que obtendrá una excepción si tratan de llamar a los métodos de longitud IList<T>-mutando.)

+0

Consulte la respuesta de Igor, ya que es más correcto; como esto pasa por JSON, cualquier matriz vacía es suficiente. –

1

usted podría utilizar Enumerable.Empty a ser un poco más explícito:

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

Aunque no es más corto y no elimina el argumento de tipo.

0

Sí, la hay. Debe definir una matriz con al menos un elemento y usar linq para filtrar la matriz sin dejar elementos. Ejemplo:

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); 
Cuestiones relacionadas