以简单的形式,我(在控制台应用程序中):
// They don't return null, but just for simplicity's sake
PropertyInfo[] GetProperties() { return null; }
FieldInfo[] GetFields() { return null; }
MethodInfo[] GetMethods() { return null; }
MethodInfo[] GetExtensions() { return null; }
然后在其他地方:
var fields = GetFields()
.Concat<MemberInfo>(GetProperties())
.Concat<MemberInfo>(GetMethods().Where(m => !m.IsSpecialName))
.Concat<MemberInfo>(GetExtensions());
这适用(编译好)。然而,在我的实际情况中,它是相似的,它不编译(我在这里使用Mono - 而不是在控制台应用程序中):
fields = target.GetFields(returnType, flags)
.Concat<MemberInfo>(target.GetProperties(returnType, flags))
.Concat<MemberInfo>(target.GetMethods(returnType, Type.EmptyTypes, flags, false)
.Where(m => !m.IsSpecialName))
.Concat<MemberInfo>(extensionMethods)
.Select(m => m.Name)
.ToArray();
错误:
Error 'System.Collections.Generic.IEnumerable<System.Reflection.MemberInfo>' does not contain a definition for 'Concat' and the best extension method overload 'System.Linq.Enumerable.Concat<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments
Error Argument 2: cannot convert from 'System.Collections.Generic.IEnumerable<System.Reflection.MethodInfo>' to 'System.Collections.Generic.IEnumerable<System.Reflection.MemberInfo>'
但是,如果我评论扩展方法,并在ToArray
子句上执行Where
,它就不会抱怨(没有编译错误)我认为没有意义:
fields = target.GetFields(returnType, flags)
.Concat<MemberInfo>(target.GetProperties(returnType, flags))
.Concat<MemberInfo>(target.GetMethods(returnType, Type.EmptyTypes, flags, false)
.Where(m => !m.IsSpecialName).ToArray())
//.Concat<MemberInfo>(extensionMethods)
.Select(m => m.Name)
.ToArray();
如果我取消注释,它会再次开始抱怨(给出相同的错误)。
任何想法发生了什么?
修改 这似乎是单声道的事情。我从控制台应用程序(首先发布的代码)复制粘贴相同的示例代码到我的实际环境,我得到了相同的错误。
修改 有关运行时的一些细节:
MonoDevelop-Unity
Version 4.0.1
Installation UUID: dc9fa750-d2af-42c8-9831-b510b08f6d28
Runtime:
Microsoft .NET 4.0.30319.18408
GTK 2.24.13
GTK# (2.12.0.0)
答案 0 :(得分:0)
这似乎是编译,但不知道为什么:/
var fields = GetFields()
.Concat(GetProperties().Cast<MemberInfo>())
.Concat(GetMethods().Cast<MemberInfo>())
.Concat(GetExtensions());
如果有人能解释我会很高兴。