有没有办法指定匿名的空可枚举类型?

时间:2010-08-02 16:55:19

标签: c# list anonymous-types enumerable

我正在回复一个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的时间太长了? :)

7 个答案:

答案 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#中返回泛型类型列表。)