0

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

我试过这个说法:

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

但我只是得到

“无法将类型‘System.Collections.Generic.IEnumerable’隐式转换为‘System.Reflection.PropertyInfo[]’。

请问有人可以提出一个可行的声明吗?

4

6 回答 6

3

用于Where过滤属性,并将结果转换为数组:

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

另外我相信你想使用这样的类型名称x.DeclaringType.Name == "CrazyNinjaBadger"。顺便说一句Select,在您的情况下,运算符将属性投影到布尔值序列。因此,您的查询实际上返回IEnumerable<bool>了与 CrazyNinjaBadger 的字符串比较类型的结果。

于 2013-02-14T14:06:33.163 回答
1

ToArray()在行尾添加

PropertyInfo[] properties = type.GetProperties()
    .Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
    .ToArray();
于 2013-02-14T14:05:31.547 回答
1

你得到那个错误是因为Select()总是返回一个 IEnumerable。

只需.ToArray()在行尾添加即可使其正常工作。

于 2013-02-14T14:06:01.677 回答
1
PropertyInfo[] properties = type.GetProperties()
                   .Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
                   .ToArray();

需要添加 ToArray() 才能转换为 Array...

于 2013-02-14T14:06:09.573 回答
1

你快到了!Select 返回一个 IEnumerable,但您正在尝试设置 PropertyInfo 数组的值。您只需要额外调用 ToArray 即可!

PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger").ToArray()
于 2013-02-14T14:07:44.423 回答
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它具有属性Name)。

最后我认为你不需要将结果设置在数组中,你可以这样做:

IEnumerable<PropertyInfo> properties = 
       type.GetProperties()
          .Where(x => x.DeclaringType.Name == "CrazyNinjaBadger");
于 2013-02-14T14:09:15.617 回答