我有一个子类,它是从两个级别的基类'派生'(是正确的单词)。我有这个类中所有属性的列表(因此包括父项的属性和父项的父项)。我想要的只是DeclaringType为“CrazyNinjaBadger”的属性(即只有我的子类中的属性)。
我试过这句话:
PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger");
但我得到了
“无法隐式转换类型 'System.Collections.Generic.IEnumerable'到 'System.Reflection.PropertyInfo []'。
请有人建议一份有效的声明吗?
答案 0 :(得分:3)
使用Where
过滤属性,并将结果转换为数组:
PropertyInfo[] properties = type.GetProperties()
.Where(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
.ToArray();
另外我相信您想要使用类型名称x.DeclaringType.Name == "CrazyNinjaBadger"
。 Btw Select
运算符将属性投影到您的案例中的布尔值序列。因此,您的查询实际上会返回IEnumerable<bool>
,并将字符串比较结果与CrazyNinjaBadger进行比较。
答案 1 :(得分:1)
在行尾添加ToArray()
PropertyInfo[] properties = type.GetProperties()
.Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
.ToArray();
答案 2 :(得分:1)
您收到该错误是因为Select()
始终返回IEnumerable。
只需在该行的末尾添加.ToArray()
即可使其正常工作。
答案 3 :(得分:1)
PropertyInfo[] properties = type.GetProperties()
.Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
.ToArray();
需要添加ToArray()以转换为数组...
答案 4 :(得分:1)
你快到了! Select返回IEnumerable,但您正在尝试设置PropertyInfo数组的值。您只需要另外打电话给ToArray就可以了!
PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger").ToArray()
答案 5 :(得分:1)
PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger");
Select(...)
返回IEnumerable<T>
的实现。编译器错误非常明确。
另一点是你要过滤属性。 .Select(...)
用于将枚举投射到相同或其他类型的另一个中。
例如:
IEnumerable<string> strings = new string[] { "0", "1" };
// Converting the string enumerable to an enumerable of integers:
IEnumerable<int> integers = strings.Select(some => int.Parse(some));
// Also, convert each strings into an anonymous object!
IEnumerable<object> whoKnows = strings.Select(some => new { Value = some });
要过滤可枚举的,您需要使用.Where(...)
。
另一方面,x.DeclaringType.ToString() == "CrazyNinjaBadger"
是正确的,但它应该是x.DeclaringType.Name == "CrazyNinjaBadger"
(您不需要将类型转换为字符串,因为Type
具有属性{{1 }})。
最后,我认为你不需要在数组中设置结果,你可以这样做:
Name