C# 如何在C4.0中访问动态类型的count属性?

C# 如何在C4.0中访问动态类型的count属性?,c#,reflection,dynamic,c#-4.0,anonymous-types,C#,Reflection,Dynamic,C# 4.0,Anonymous Types,我有一个follow方法,它返回一个表示IEnumerable的动态对象。从该方法返回的IEnumerable没有Count属性,所以我不知道你在说什么。可能您忘记在末尾写入ToList以将其具体化为列表,或者您想调用IEnumerable上的Count方法?尝试使用Linq countusing System.Linq;段数。计数需要枚举才能完成收集,您可能需要: if (!Segments.Any()) { } 您的函数应该返回IEnumerable而不是dynamic,您需要显式调用E

我有一个follow方法,它返回一个表示IEnumerable的动态对象。从该方法返回的IEnumerable没有Count属性,所以我不知道你在说什么。可能您忘记在末尾写入ToList以将其具体化为列表,或者您想调用IEnumerable上的Count方法?

尝试使用Linq countusing System.Linq;段数。计数需要枚举才能完成收集,您可能需要:

if (!Segments.Any()) 
{
}

您的函数应该返回IEnumerable而不是dynamic,您需要显式调用Enumerable.Count

IEnumerable<string> segments =
  from x in new List<string> { "one", "two" } select x;

Console.WriteLine(segments.Count());  // works

dynamic dSegments = segments;

// Console.WriteLine(dSegments.Count());  // fails

Console.WriteLine(Enumerable.Count(dSegments));  // works
有关为什么动态类型不支持扩展方法的讨论,请参阅

d前缀仅用于示例代码-请不要使用匈牙利符号


更新:就个人而言,我会选择使用if!Segments.Any和return IEnumerable。

您也可以使用属性Length

if (!Segments.Length)
{
    `enter code here`
}

您应该强烈考虑创建实数类型,而不是匿名类型,并返回其中的InEnaby。为此目的使用dynamic会消除静态类型的所有优点。@Chevex,如果OP从公共方法返回此值,我不明白为什么我们认为它只会被调用一次。@mquander,我完全不同意静态类型即使在一次性情况下也没有任何优点。如果您建议,如果您可以从一个方法返回匿名类型作为该类型,那就太好了,我同意!但你不能。在这种情况下,静态类型仍然非常有用。intellisense、编译时安全性等@True,不必争论,但我认为不应该使用dynamic来链接匿名类型。永远不要使用它,因为它太懒了,无法创建正确的类型。它应该用于反射、动态分派、COM或动态脚本。@Chevex,是的,这就是为什么这些是注释而不是答案的原因:可能没有静态Count属性,但存在Count LINQ扩展。我认为他的观点是,他不知道如何使用返回的动态对象。如果他碰巧引用了一个实际存在的属性或方法,那么他会正确地使用它,所以他一定是混淆了什么。啊,是的,我会通知他在Count调用中添加括号。+1-我必须尝试一下,但这是有效的。虽然我怀疑OP会想要返回IEnumerable以获取匿名类型的属性。+1完全忘记了使用Dynamics时的注意事项。我真的很想知道被接受的答案是如何起作用的。谢谢,太好了+++++++
IEnumerable<string> segments =
  from x in new List<string> { "one", "two" } select x;

Console.WriteLine(segments.Count());  // works

dynamic dSegments = segments;

// Console.WriteLine(dSegments.Count());  // fails

Console.WriteLine(Enumerable.Count(dSegments));  // works
if (!Segments.Length)
{
    `enter code here`
}