C# 是否有方法指定匿名空可枚举类型?
我返回一个Json注释类型: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
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>()