2010-08-02 8 views
5

Ich bin eine Json'ed annonymous Art Rückkehr:Gibt es eine Möglichkeit, einen anonymen leeren aufzählbaren Typ anzugeben?

IList<MyClass> listOfStuff = GetListOfStuff(); 

return Json(
    new { 
     stuff = listOfStuff 
    } 
); 

In bestimmten Fällen, ich weiß, dass listOfStuff leer. Also will ich nicht den Overhead von GetListOfStuff() anrufen (was einen Datenbankanruf macht).

Also in diesem Fall ich schreibe:

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

, die ein bisschen unnötig ausführliche scheint. Es ist mir egal, welche Art von List es ist, weil es sowieso leer ist.

Gibt es eine Kurzschrift, die verwendet werden kann, um leeres enumerable/list/array anzugeben? Etwas wie:

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

Oder habe ich Javascript zu lange programmiert? :)

+0

Zu viel Javascript. –

Antwort

5

Im Wesentlichen möchten Sie ein leeres Array ausgeben. C# kann den Array-Typ aus den Argumenten ableiten, aber bei leeren Arrays müssen Sie noch den Typ angeben. Ich schätze, deine ursprüngliche Art, es zu tun, ist gut genug. Oder Sie könnten dies tun:

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

Die Art der Anordnung ist nicht wirklich wichtig, wie jeder leer enumerable in [] in JSON übersetzen. Ich denke, zur besseren Lesbarkeit, geben Sie den Typ des leeren Arrays an. Auf diese Art und Weise, wenn andere Ihren Code lesen, ist es offensichtlicher, was dieses Mitglied sein soll.

+0

+1 für den Hinweis, dass JSON in diesem Fall den Typ nicht interessiert; Das war mir nicht bewusst –

-3

Ich denke, Sie sprechen über C# hier. Mein Wissen ist in C# begrenzt, aber ich glaube nicht, dass Sie ein neues Objekt ohne Typ erstellen können. Warum können Sie keine generische neue Liste [] zurückgeben? (Vielleicht mische ich Java-Generics hier, bin mir nicht sicher, ob man eine generische Typenliste in C# zurückgeben kann).

2

einen generischen Typ schickt ?:

List<Object>() 

oder ein leeres Objekt Array senden: new Object[0]

2

Sie nicht, welche Art von Liste könnte egal es ist, aber es zählt zu den Anrufer. C# versucht im Allgemeinen nicht, Typen auf der Grundlage der Variablen zu ermitteln, auf der sie gespeichert wird (genau so, wie Sie keine Überladungen von Methoden für den Rückgabetyp erstellen können), daher muss der Typ angegeben werden. Das heißt, Sie können new ListOfStuff[0] verwenden, wenn Sie ein leeres Array zurückgegeben möchten. Dies hat den Effekt, unveränderlich zu sein (in der Länge) an den Anrufer (sie werden eine Ausnahme, wenn sie versuchen, die Länge mutiert IList<T> Methoden aufrufen.)

+0

Siehe Igors Antwort, wie es richtiger ist; Da dies JSON durchläuft, ist jedes leere Array ausreichend. –

1

Sie Enumerable.Empty verwenden könnte ein wenig mehr explizit zu sein:

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

Obwohl es nicht kürzer ist und das Argument Typ nicht los wird.

0

Ja, gibt es. Sie müssen ein Array mit mindestens einem Element definieren und linq verwenden, um das Array ohne Elemente zu filtern. Beispiel:

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