簡體   English   中英

LINQ查詢PropertyInfo列表

[英]LINQ query on PropertyInfo list

我有一個子類,它是從兩個級別的基礎類“派生”的(是正確的詞)。 我有該類中所有屬性的列表(因此包括父級和父級的屬性)。 我想要的只是DeclaringType為“ CrazyNinjaBadger”的屬性(即僅來自我的子類的屬性)。

我已經嘗試過以下語句:

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

但是我得到

“無法將類型'System.Collections.Generic.IEnumerable'隱式轉換為'System.Reflection.PropertyInfo []'。

請有人可以提出一個行之有效的聲明嗎?

Where過濾性能,並轉換結果數組:

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

我也相信您想使用類似x.DeclaringType.Name == "CrazyNinjaBadger"類型名稱。 Btw Select運算符將屬性設置為布爾值序列(在您的情況下)。 因此,您的查詢實際上返回IEnumerable<bool> ,其類型與CrazyNinjaBadger的字符串類型進行比較。

在行尾添加ToArray()

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

之所以出現該錯誤,是因為Select()始終返回IEnumerable。

只需.ToArray()的末尾添加.ToArray()即可使其工作。

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

需要添加ToArray()才能轉換為Array ...

你快到了! Select返回IEnumerable,但是您試圖設置PropertyInfo數組的值。 您所需要的只是對ToArray的一個附加調用,您就在那里!

PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger").ToArray()
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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM