PropertyInfo列表上的LINQ查询

时间:2013-02-14 14:04:21

标签: c# linq

我有一个子类,它是从两个级别的基类'派生'(是正确的单词)。我有这个类中所有属性的列表(因此包括父项的属性和父项的父项)。我想要的只是DeclaringType为“CrazyNinjaBadger”的属性(即只有我的子类中的属性)。

我试过这句话:

PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger");

但我得到了

  

“无法隐式转换类型   'System.Collections.Generic.IEnumerable'到   'System.Reflection.PropertyInfo []'。

请有人建议一份有效的声明吗?

6 个答案:

答案 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