2013-02-14 74 views
0

我有一个子类,它是从一个基类的两个级别'派生'(是正确的词)。我有这个类中所有属性的列表(这样就包含了父类的属性和父类的父类)。我想要的只是DeclaringType是“CrazyNinjaBadger”的属性(即只有来自我的子类的属性)。关于PropertyInfo列表上的LINQ查询

我已经试过这样的说法:

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

但我只是得到

“不能隐式类型 'System.Collections.Generic.IEnumerable' 转换为 “的System.Reflection。 PropertyInfo []'。

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

回答

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

Select(...)返回IEnumerable<T>一个implemenetation。编译器错误非常明确。

另一点是你想过滤属性。 .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"); 
+0

谢谢你的额外的细节...我想接受的答案去你:) – markp3rry 2013-02-14 14:10:14

+0

@ markp3rry选择运算符是错误的(请参阅下面的答案)! – 2013-02-14 14:13:00

+0

@lazyberezovsky是的,我已经解决了这个问题。谢谢! – 2013-02-14 14:15:06

1

在你得到的错误,因为Select()总是返回一个IEnumerable行

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

的末尾添加ToArray()

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

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

的ToArray的()需要被添加到转换为阵......

3

使用Where过滤性能,并转换结果数组:

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

而且我相信你想使用类似这样的名字x.DeclaringType.Name == "CrazyNinjaBadger"。 Btw Select运算符将属性投影到您的案例中的布尔值序列。因此,您的查询实际上返回IEnumerable<bool>,并将类型字符串比较的结果返回给CrazyNinjaBadger。

1

你快到了!选择返回一个IEnumerable,但是你想设置一个PropertyInfo数组的值。所有你需要的是一个额外的电话ToArray,你在那里!

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