C# 是否有方法指定匿名空可枚举类型?

C# 是否有方法指定匿名空可枚举类型?,c#,list,anonymous-types,enumerable,C#,List,Anonymous Types,Enumerable,我返回一个Json注释类型: IList<MyClass> listOfStuff = GetListOfStuff(); return Json( new { stuff = listOfStuff } ); 这似乎有点不必要的冗长。我不在乎它是什么类型的列表,因为它是空的 是否有可以用来表示空枚举/列表/数组的速记?比如: return Json( new { stuff = new [] } ); 还是我编写JavaSc

我返回一个Json注释类型:

IList<MyClass> listOfStuff = GetListOfStuff();

return Json(
   new {
       stuff = listOfStuff
   }
);
这似乎有点不必要的冗长。我不在乎它是什么类型的
列表,因为它是空的

是否有可以用来表示空枚举/列表/数组的速记?比如:

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

还是我编写JavaScript的时间太长了?:)

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

发送泛型类型?:

List<Object>()
List()

或者发送一个空的对象数组:
新对象[0]

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

您可以使用
Enumerable.Empty
更明确一些:

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

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

实际上,您希望发出一个空数组。C#可以从参数推断数组类型,但对于空数组,仍然必须指定类型。我想你最初的做法已经足够好了。或者你可以这样做:

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

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

是的,有。您必须定义一个至少包含一个元素的数组,并使用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);

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

Enumerable.Empty<dynamic>()
Enumerable.Empty()

这对我来说很有效

请看Igor的答案,因为它更正确;由于这是通过JSON进行的,任何空数组都足够了。+1用于指出JSON不关心本例中的类型;我不知道
Enumerable.Empty<dynamic>()