8

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

4

7 回答 7

7

本质上你想发出一个空数组。C# 可以从参数中推断出数组类型,但是对于空数组,您仍然需要指定类型。我想你原来的做法已经足够好了。或者你可以这样做:

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

数组的类型并不重要,因为任何空的枚举都将转换为[]JSON。我想,为了可读性,请指定空数组的类型。这样,当其他人阅读您的代码时,该成员应该是什么就更明显了。

于 2010-08-02T23:01:51.390 回答
4

你可以使用Enumerable.Empty更明确一点:

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

虽然它不短并且没有摆脱类型参数。

于 2010-08-02T22:53:51.723 回答
2

您可能不关心它是什么类型的列表,但它对调用者很重要。C# 通常不会尝试根据存储它的变量来推断类型(就像您不能在返回类型上创建方法的重载一样),因此有必要指定类型。也就是说,new ListOfStuff[0]如果你想返回一个空数组,你可以使用。这对调用者具有不可变(长度)的效果(如果他们尝试调用长度可变IList<T>方法,他们将得到一个异常。)

于 2010-08-02T22:42:03.220 回答
2

dynamic在处理匿名类型时也是一个更好的选择

Enumerable.Empty<dynamic>()

这对我很有效

于 2019-09-11T11:36:11.853 回答
2

就在这里。您必须定义一个至少包含一个元素的数组,并使用 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);
于 2016-04-14T16:16:33.277 回答
1

发送泛型类型?:

List<Object>()

或发送一个空对象数组:new Object[0]

于 2010-08-02T22:29:27.207 回答
-4

我猜你在这里谈论 C#。我的 C# 知识有限,但我认为您不能创建没有类型的新对象。为什么不能返回一个通用的 new List[] ?(可能在这里混合了 Java 泛型,我不确定是否可以在 C# 中返回泛型类型列表)。

于 2010-08-02T17:19:30.947 回答