我正在回复一个Json'ed匿名类型:
IList<MyClass> listOfStuff = GetListOfStuff();
return Json(
new {
stuff = listOfStuff
}
);
在某些情况下,我知道listOfStuff
将为空。所以我不希望调用GetListOfStuff()
(进行数据库调用)的开销。
所以在这种情况下我写的是:
return Json(
new {
stuff = new List<ListOfStuff>()
}
);
这似乎有点不必要的冗长。我不关心它是什么类型List
,因为它无论如何都是空的。
是否有可用于表示空枚举/列表/数组的简写?类似的东西:
return Json(
new {
stuff = new []
}
);
或者我编程JavaScript的时间太长了? :)
答案 0 :(得分:5)
基本上你想要发出一个空数组。 C#可以从参数中推断出数组类型,但对于空数组,您仍然需要指定类型。我猜你原来这样做的方式已经足够了。或者你可以这样做:
return Json(
new {
stuff = new ListOfStuff[]{}
}
);
数组的类型并不重要,因为任何空的枚举都会在JSON中转换为[]
。我想,为了便于阅读,请指定空数组的类型。这样,当其他人阅读您的代码时,该成员应该更加明显。
答案 1 :(得分:2)
发送通用类型?:
List<Object>()
或发送一个空对象数组:new Object[0]
答案 2 :(得分:2)
您可能不关心它是什么类型的列表,但它对调用者很重要。 C#通常不会尝试根据存储它的变量来推断类型(就像你不能在返回类型上创建方法的重载一样),所以有必要指定类型。也就是说,如果要返回一个空数组,可以使用new ListOfStuff[0]
。这具有对调用者不可变(长度)的效果(如果他们试图调用长度变异的IList<T>
方法,他们将获得异常。)
答案 3 :(得分:1)
您可以使用Enumerable.Empty
更明确一点:
return Json(
new {
stuff = Enumerable.Empty<ListOfStuff>()
}
);
虽然它不短,但没有摆脱类型参数。
答案 4 :(得分:1)
是的,有。您必须定义一个至少包含一个元素的数组,并使用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);
答案 5 :(得分:0)
dynamic
也是更好的选择
Enumerable.Empty<dynamic>()
这对我来说很好
答案 6 :(得分:-3)
我猜你在这里谈论C#。我的知识在C#中是有限的,但我认为你不能创建一个没有类型的新对象。为什么你不能返回一个通用的新List []? (可能在这里混合Java泛型,我不确定是否可以在C#中返回泛型类型列表。)